Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
题意:让你在原串里面添加最少的字母个数使原串变成回文串。
思路:最少补充的字母个数=原序列的长度-原串和逆串的最长公共子串的长度。dp储存的是从i到j的相同字母的个数。
PS:因为5000*5000肯定超内存,所以在这里引入滚动数组的知识。滚动数组很适合用在二维DP而且是数组在很大时,可以节省内存,消除超内存的隐患!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
const int inf=0x3f3f3f3f;
char str1[5010];
char str2[5010];
int dp[2][5010];
int main()
{
int n,i,j;
while(~scanf("%d",&n)){
getchar();
for(i=1;i<=n;i++){
scanf("%c",&str1[i]);
str2[n-i+1]=str1[i];
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
if(str1[i]==str2[j])
dp[i%2][j]=dp[(i-1)%2][j-1]+1;
else
dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]);
}
printf("%d\n",n-dp[n%2][n]);
}
return 0;
}
POJ 1159-Palindrome(dp_回文串+滚动数组)
原文:http://blog.csdn.net/u013486414/article/details/43266311