POJ 1159 Palindrome

原题请戳这里
题意:给你个串,求最少添加多少个字符使它成为回文串。
思路:没有思路

网上题解的思路 DP

将正序列和反序列做一次LCS就行
dp[i][j]表示正向到 i , 反向到 j 的LCS长度
dp[i][j]=max( dp[i-1][j-1]+1 //正向i==反向j
dp[i-1][j], dp[i][j-1] //正向i!=反向j )
最后要求的是len-dp[len][len]
转自:http://blog.csdn.net/allenlsy/article/details/4967105

用short不用滚动数组 还是可以过的,,(5000*5000/1024*2<50000,题中的memory是65536K)

//By: Sirius_Ren
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
short f[5005][5005];
int n;
char a[5555],b[5555];
int main()
{
    scanf("%d",&n);
    scanf("%s",a+1);
    for(int i=0;i<n;i++)b[i+1]=a[n-i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(a[i]==b[j])
                f[i][j]=f[i-1][j-1]+1;
            else
                f[i][j]=max(f[i-1][j],f[i][j-1]);
    printf("%d",n-f[n][n]);
}

这里写图片描述

这是用滚动数组的;;;

//By: Sirius_Ren
#include <cstdio>
#include <algorithm>
using namespace std;
short f[2][5005];
int n;
char a[5005],b[5005];
int main(){
    scanf("%d",&n);
    scanf("%s",a+1);
    for(int i=0;i<n;i++) b[i+1]=a[n-i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(a[i]==b[j])f[i%2][j]=f[(i-1)%2][j-1]+1;
            else f[i%2][j]=max(f[(i-1)%2][j],f[i%2][j-1]);
    printf("%d",n-f[n%2][n]);
}

这里写图片描述

原文地址:https://www.cnblogs.com/SiriusRen/p/6532467.html