题解 P1435 【回文字串】
额,看到楼下都是用什么LCS之类的...
于是我打算来一个不一样的
首先我们看到此题,显然会想到区间DP,且此题是属于2D/0D问题
所以空间复杂度为n^2,时间复杂度也与n^2同阶
(空间优化:楼下讲清楚了...)
关于DP方程的定义:
定义f[i][j]为第i个字符到第j个字符这一段子串需要插入字符构成回文串的最小值
-1 如果str[i]与str[j]相同,显然可以知道f[i][j]=f[i+1][j-1];
-2 如果...不同,可以通过判断是把字符添加在左边小点还是右边小点,即f[i][j]=min(f[i+1][j],j[i][j-1])+1;
(讲个笑话:我自己“自作聪明”,先找了数据自己跑,然后贴数据的时候好像不挂文件就复制不完,结果我调了半个多小时.....(无奈)
-因为此题我是在内部OJ上做的,所以空间开的不同,此题直接乱开空间(233)就是了
#include<stdio.h>
#include<algorithm>
using namespace std;
char str[5001];
int f[2][5001];
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
int n;
scanf("%d",&n);
scanf("%s",str+1);
int now=0;
for(int i=n-1;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
{
if(str[i]==str[j])
{
f[now^1][j]=f[now][j-1];
}
else
{
f[now^1][j]=min(f[now][j],f[now^1][j-1])+1;
}
}
now=now^1;
}
printf("%d",f[now][n]);
fclose(stdin);
fclose(stdout);
return 0;
}