POJ 1159 Palindrome dp

来源:互联网 发布:那里有淘宝号买 编辑:程序博客网 时间:2024/06/04 01:08
//题意:求至少添加多少个元素使原字符串构成回文//思路:将原字符串翻转,两字符串求最长公共子串,然后为每个没匹配到的字符在相应对称的位置添加一个元素即可,//结果是n - Lcs.size//因为开dp[5000][5000]超内存,所以用到了传说中的滚动数组#include <stdio.h>#include <string.h>#define N 5005char a[N],b[N];//int dp[N][N]; ---> 超内存int dp[2][N];int max(int x, int y){    return x > y ? x : y;}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {getchar();for(int i=1; i<=n; i++){scanf("%c",&a[i]);b[n-i+1] = a[i];}memset(dp,0,sizeof(dp));for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)if(a[i]==b[j])dp[i%2][j] = dp[(i-1)%2][j-1] + 1;elsedp[i%2][j] = max(dp[(i-1)%2][j], dp[i%2][j-1]);printf("%d\n",n-dp[n%2][n]);    }    return 0;}

原创粉丝点击