标签:
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