POJ 1159 Palindrome
题目大意:
给出一个字符串,问添加多少个字符才可以使这个字符串成为回文串。
解题办法:
将字符串逆序,同原串进行最长公共子序列处理,串的长度减去最长子序的长度就是题解。
注意:
这个题对内存的控制十分严格,5000*5000 int型数组是开不开的,可以开short型,也可以借这个题练习一下滚动数组。
下面是代码:
#include <stdio.h> int max(int a,int b) { if(a<b) { a=b; } return a; } short dp[5005][5005]; int main() { int n; char s[5005]; while(scanf("%d",&n)!=EOF) { int k,j,i=n-1; scanf("%s",s); if(n==1) { puts("0"); continue; } for(j=0; j<=n; j++) { dp[j][0]=0; dp[0][j]=0; } for(j=0; j<n; j++) { for(k=0; k<n; k++) { if(s[j]==s[i-k]) { dp[j+1][k+1]=dp[j][k]+1; } else { dp[j+1][k+1]=max(dp[j+1][k],dp[j][k+1]); } } } printf("%d\n",n-dp[n][n]); } return 0; }