Palindrome--poj 1159(最长公共子字符串+滚动数字)

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

 

题目大意:  给你一个n  代表n个字符   第二行给你一个字符串  求使这个字符串变成回文字符串 最少需要添加多少个字符

 

分析:   原来的字符串长度-原来的字符串与逆置后的字符串的最长公共字串  就是求得的添加的字符

 

但是n是5000  如果单用dp[N][N]  肯定会内存超限   所以我们用滚动数字   

这是我第一次接触滚动数字  好像也是dp的一种   就是把第一维变成2 反正每一次i j 都只用到上一层   

 

#include<cstdio>
#include<cstring>
#include<stack>
#include<vector>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;

#define N 5100
#define INF 0xfffffff
#define memset(a,b) memset(a,b,sizeof(a))

int dp[2][N];
char str[N],ch[N];
int main()
{
    int n;

    while(scanf("%d",&n)!=EOF)
    {
        memset(dp,0);
        memset(str,0);
        memset(ch,0);
        scanf("%s",str);
        int l=strlen(str);
        for(int i=0;str[i];i++)
            ch[i]=str[l-i-1];

        for(int i=0;str[i];i++)
        {
            for(int j=0;ch[j];j++)
            {
                if(str[i]==ch[j])
                dp[(i+1)%2][j+1]=dp[i%2][j]+1;
                else
                {
                    dp[(i+1)%2][j+1]=max(dp[i%2][j+1],dp[(i+1)%2][j]);
                }
            }
        }
        printf("%d\n",l-dp[l%2][l]);
    }
    return 0;
}

 

posted @ 2016-04-12 13:36  啦咯  阅读(204)  评论(0编辑  收藏  举报