-
时间限制:
- 10000ms 内存限制:
- 128000kB
-
描述
-
如果一个字符串正过来读和倒过来读是一样的,那么这个字符串就被称作回文串。
例如
abcdcba,abcddbca 就是回文串,而 abcdabcd 不是。
你要解决的问题是:
对于任意一个字符串,输出将这个字符串变为回文串需要插入的最少字符个数,比如,Ab3bd只需要插入 2 个字符就可以变为一个回文串。
输入
-
第一行是一个整数 N
第二行是一个长度为N的字符串S
输出
- 一行一个整数,表示将 S 变为回文串需要插入的最小字符个数 样例输入
-
5 Ab3bd
样例输出
-
2
提示
- 对于所有数据,1<=n<=5000
可以用两种方法,属于动态规划问题。 方法一:找回文特点,共两种情况;方法二:正串反串做LCS。
第一种方法,代码如下:
//D1077最短回文
//用辅助数组记录
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define min(a, b) (a>b?b:a) //不用定义ab的类型
char b[5010];
int a[5010][5010];
int fuct(int i, int j){
if(i>=j){
return 0;
}
if(a[i][j]!=0){
return a[i][j];
}
if(b[i]==b[j]){
a[i][j] = fuct(i+1, j-1);
}
else{
a[i][j] = min(fuct(i+1,j), fuct(i, j-1))+1;
}
return a[i][j];
}
int main()
{
int n;
//freopen("in.txt", "r", stdin);
while(scanf("%d", &n)!=EOF){
scanf("%s", b);
memset(a, 0, sizeof(a));
printf("%d\n", fuct(0, n-1));
}
return 0;
}