题目描述
给定字符串的长度和字符串,求最少添加几个字符可以构成一个回文串。
如果开5000 * 5000 的数组,会爆内存。观察算法,发现A[i][j]只和A[i-1][j] ,A[i][j-1]有关。采用滚动数组,节省空间。 A掉。。。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <algorithm>
#define N 5005
using namespace std;
char A[N],B[N];
int n,C[2][N];
void fun()
{
for(int i = 0;i <= n;i++)
{
C[0][i] = 0;
}
C[1][0] = 0;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
if(A[i] == B[j])
C[(i+1)&1][j+1] = C[i&1][j] + 1;
else
C[(i+1)&1][j+1] = max(C[i&1][j+1],C[(i+1)&1][j]);
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
scanf("%s",A);
for(int i = 0;i < n;i++)
{
B[n-i-1] = A[i];
}
fun();
printf("%d\n",n-C[n&1][n]);
}
return 0;
}