题意:
输入一个n和长度为n的字符串,求最少需要增加多少个字符,使之成为一个回文(从左到右读和从右到左读是一样的) (其实就是括号配对的变形)
知识点:
滚动数组内存优化。就像dp[5005][5005] ,占用的内存太大 ,无法编译,利用滚动数组就能很好的解决这个问题,简单来说就是dp[3][5005]来代替dp[5005][5005] ,用dp[i%3][j],dp[(i-1)%3][j], dp[(i+1)%3][j]表示。(其实这一题还可以这样改:用short int dp[5005][5005])
具体可以看http://blog.csdn.net/niushuai666/article/details/6677982,解释的比较详细
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 char str[5005]; 5 int dp[3][5005]; 6 int main() 7 { 8 int n; 9 int i,j,k; 10 cin>>n; 11 cin>>str; 12 for(int l=2;l<=n;l++) 13 { 14 for(i=0;i<n-l+1;i++) 15 { 16 j = i+l-1; 17 if(str[i]!=str[j]) 18 dp[i%3][j] = min(dp[(i+1)%3][j]+1,dp[i%3][j-1]+1); 19 else dp[i%3][j] = dp[(i+1)%3][j-1]; 20 } 21 } 22 cout<<dp[0][n-1]<<endl; 23 return 0; 24 }
时间: 2024-10-05 23:54:53