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