HDU 1513 Palindrome

来源:互联网 发布:微信矩阵群 编辑:程序博客网 时间:2024/04/28 09:01

给出一个字符串,问你需要加多少个字符可以使得这个字符串变成回文字符串。一开始就猜到了,答案等于字符串长度-字符串和逆序字符串的最长公共子序列;开了一个dp[5000][5000] 直接MLE。要用滚动碉数组。

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;char s1[5010],s2[5010];int dp[2][5010];int main(){    int n;    while(~scanf("%d",&n))    {        getchar();        memset(dp,0,sizeof(dp));        scanf("%s",s1);        int j=0;        for(int i = n-1 ; i >= 0 ; i--)        {            s2[j++] = s1[i];//逆序字符串。        }        for(int i = 1 ; i <= n ; i++)        {            for(int k = 1 ; k <= n ; k++)            {                if(s1[i-1] == s2[k-1]) dp[i%2][k] = dp[(i-1)%2][k-1]+1;                else dp[i%2][k] = max(dp[i%2][k-1],dp[(i-1)%2][k]);            }        }        printf("%d\n",n-dp[n%2][n]);    }    return 0;}
0 0
原创粉丝点击