**
航电oj:Palindrome
**
#题目描述
#给你一列字符 问要加多少个 变成回文列 (从前往后 从后往前 一样的)
#转化为求最大公共子序列
#知识点
动态规划
#代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[5001],b[5001];
int move[2][5001];//. 奇数 与偶数 分别是不同的两条列
int n;
int maxx(int a,int b)
{
return a>b?a:b;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(move,0,sizeof(move));
scanf("%s",&a);
//int count =0;
for(int i=0;i<n;i++)
b[i] = a[n-1-i];
//求两列的最大公共子序列
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i] == b[j])
move[(i+1)%2][j+1] = move[i%2][j]+1;//数字加一 奇偶性会改变
else
move[(i+1)%2][j+1] = maxx(move[i%2][j+1],move[(i+1)%2][j]);//!!! 不相同时 看另一个奇偶性的值 或当前奇偶性的下个值 的较大的
}
}
printf("%d\n",n-move[n%2][n]);//总共的 减去 相同的 等于 要补的
}
return 0;
}
#总结
想到的不一定对 对的不一定会 这个好难 学别的大佬的 想不到 要想到!!(⊙﹏⊙)--------(ง •_•)ง