uva 10453 【回文串区间dp】
题意:给定字符串,问最少插入多少个字符使其变成回文串,并任意输出一种结果。
题解:和Uva 10739类似,这里是只能增加。类似定义dp[i][j]表示子串Si...Sj变为回文串需要插入字符的最小数。当s[i]==s[j]时,dp[i][j]=dp[i+1][j-1];当两者不相等时,dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1。然后dp出结果,dfs()输出答案。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 int dp[1050][1050]; 8 char s[1050]; 9 10 void dfs(int l,int r) 11 { 12 if(l>r) return; 13 if(l==r) cout<<s[l]; 14 else if(s[l]==s[r]){ 15 cout<<s[l];dfs(l+1,r-1);cout<<s[r]; 16 }else if(dp[l][r]==dp[l+1][r]+1){ 17 cout<<s[l];dfs(l+1,r);cout<<s[l]; 18 }else{ 19 cout<<s[r];dfs(l,r-1);cout<<s[r]; 20 } 21 } 22 23 int main() 24 { 25 while(cin>>s) 26 { 27 int len=strlen(s); 28 for(int i=0;i<len;i++) dp[i][i]=0; 29 for(int i=len-1;i>=0;i--) 30 { 31 for(int j=i+1;j<len;j++){ 32 if(s[i]==s[j]) 33 dp[i][j]=dp[i+1][j-1]; 34 else 35 dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1; 36 } 37 } 38 cout<<dp[0][len-1]<<" "; 39 dfs(0,len-1); 40 cout<<endl; 41 } 42 return 0; 43 }