POJ1159Palindrome

http://poj.org/problem?id=1159

题意 : 给定一个字符串,问最少插入多少字符,使该字符串变成回文串

思路 : 设原字符串序为X,逆序列为Y,则最少需要补充的字母数 = X的len减去X和Y的最长公共子序列的长度,又是一个动态规划问题,这个题的数据范围到5000,倒不是说会超时,但是会超内存,在书上看了一个很好的方法就是滚动数组,感觉挺新鲜的,也挺厉害的,但是滚动数组只节省空间,不省时间

#include<iostream>
#include<string>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std ;
int dp[3][5200];
int main()
{
    string s1,s2 ;
    int n,i,j ;
    while(cin >> n)
    {
        cin>>s1 ;
        s2 = s1 ;
        reverse(s1.begin(),s1.end());
        memset(dp,0,sizeof(dp)) ;
        for(i = 1 ; i <= n ; i++)
        {
            for(j = 1 ; j <= n ; j++)
            {
                dp[i%2][j] = max(dp[(i-1)%2][j],dp[i%2][j-1]) ;
                if(s1[i-1] == s2[j-1])
                {
                    int temp = dp[(i-1)%2][j-1]+1 ;
                    dp[i%2][j] = max(dp[i%2][j],temp);
                }
            }
        }
        cout<<n-dp[n%2][n]<<endl ;
    }
    return 0 ;
}
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3276391.html