标签:des style blog http color io os ar strong
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 51631 | Accepted: 17768 |
Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
题意:
给你一串字符串,让你求最少增加几个字符,才干使得这个字符串是个回文串。
分析:
设a[i]是这个字符串,b[i]是这个字符串的逆序串。
那么a[i],b[i]的最长公共子序列就是所求的字符串里拥有的最大的回文串。
然后用总串长度减去最大的回文串长度即为所求。
求最长公共子序列:
1).递归式写成:
2).回溯输出最长公共子序列过程:
#include<stdio.h> #include<iostream> using namespace std; #define Max 5001 char a[Max],b[Max]; short int dp[Max][Max]; // 用short int数组 int max(int x,int y) { return (x>y?x:y); } int main () { int n,i,j; scanf("%d",&n); getchar(); for(i=1,j=n;i<=n,j>=1;i++,j--) { scanf("%c",&a[i]); b[j]=a[i]; } for(i=0;i<=n;i++) { dp[i][0]=0; dp[0][i]=0; } for(i=1;i<=n;i++) // 求最长公共子序列 { for(j=1;j<=n;j++) { if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } printf("%d\n",n-dp[n][n]); // 总串长度减去最长公共子序列(最大的回文串)长度 return 0; }
标签:des style blog http color io os ar strong
原文地址:http://www.cnblogs.com/gcczhongduan/p/3986236.html