poj 1159 Palindrome

来源:互联网 发布:局域网是什么端口号 编辑:程序博客网 时间:2024/05/21 02:35

题目:

题目:

就是让你求,给的字符串最少添多少个字符,使它成为回文子串。

分析:

这是一道dp呀
dp

最正常也是最简单的思路是:

f[i][j]表示 i-j 最少要添加的。

然后就是从网上 看到的。。

一个ppt 讲的超级详细。。。。虽然 朕 没看懂。

然后,粘朕的代码。

你瞧啊,只有 30行。
另外 这道题 如果不用 滚动数组 就可以开short 的 可以过

滚动数组 会节约一些。

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;//by mars_chint n,ans;short dp[2][5001];char a[5001],b[5001];int main(){    scanf("%d",&n);    scanf("%s",a);    for(int i=n-1;i>=0;i--)    {        b[n-1-i]=a[i];    }    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            if(a[i] == b[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]);            }        }    }    ans=n-dp[n%2][n];    printf("%d\n",ans);    return 0;}
0 0
原创粉丝点击