题目:给定一个字符串,问最少插入多少字符,使字符串变成回文字符串。
思路:X:原字符串 Y:逆字符串 需要插入的字符数=X的长度-(X与Y的LCS的长度)
这里使用了滚动数组,压缩空间,原因:d[i][j]只依赖于 d[i-1][j] d[i][j-1]
1 #include <iostream> 2 #include <string> 3 #include <cmath> 4 #include <vector> 5 #include <algorithm> 6 #include <sstream> 7 #include <cstring> 8 9 using namespace std; 10 int dp[2][5005]; 11 int main() 12 { 13 14 string s1,s2; 15 16 while(cin>>s1) 17 { 18 s2=s1; 19 int n,i,j; 20 n=s1.size(); 21 reverse(s1.begin(),s1.end()); 22 memset(dp,0,sizeof(dp)); 23 24 for(i=1;i<=n;i++) 25 for(j=1;j<=n;j++) 26 if(s1[i-1]==s2[j-1]) 27 dp[i%2][j]=dp[(i-1)%2][j-1]+1; 28 else 29 dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]); 30 31 cout<<n-dp[n%2][n]<<endl; 32 33 } 34 return 0; 35 }