---恢复内容开始---
Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
解题思路:
题目大意是这样的,我们输入一个整数n和一个字符串,取这个字符串的前n位,然后问我们需要改变几个字符可以使这个字符串变成一个回文字符串。我们将这个字符串存在a数组中,然后将这个字符的逆序存在b数组中,这样我们就得到了两个数组,我们可以把这个题目转化为一个求最大公共子序列的问题了,我们求出这两个数组的最大公共子序列,然后将这个数组的长度减去这个最大公共子序列的长度,就得到了我们需要改变的字符个数。这是这种题目解题的一贯思路回文+最大公共子序列
程序代码:
#include <iostream>
using namespace std;
const int N=5005;
char a[N],b[N];
short save[N][N];
int n;
int max(int x,int y)
{
	return x>y?x:y;
}
int maxlen(char *str1,char *str2)
{
	int i,j;
    for(i=0;i<=n;i++)
        save[i][0]=save[0][i]=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)   //以下从str1[0]和str2[0]开始比较
            save[i][j]=(str1[i-1]==str2[j-1] ? save[i-1][j-1]+1 : max(save[i-1][j],save[i][j-1]));
    return save[n][n];
}
int main()
{
	cin>>n;
	scanf("%s",a);
	for(int i=0;i<n;i++)
		b[n-i-1]=a[i];
	b[n]=‘\0‘;
	cout<<n-maxlen(a,b)<<endl;
	return 0;
}
---恢复内容结束---
原文:http://www.cnblogs.com/xinxiangqing/p/4730979.html