AcWing 1222. 密码脱落
原题链接
中等
作者:
哈基咪
,
2020-10-07 19:33:05
,
所有人可见
,
阅读 2449
//密码脱落
//题目的原意;给出一个字符串,问加多少个字符可以变成回文串
//这其实就等价于 给一个字符串,减多少个字符可以变成回文串
//那么种子数= 字符串长度-字符串的最大子回文序列长度
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1000;
int f[N][N];
char str[N];
int main()
{
cin>>str;
int n=strlen(str);
//由于状态数组中更新时 l,r可能用到l+1,r等等情况
//所以线性更新是不行的,采取循环区间长度的方法来更新
for(int len=1;len<=n;len++)
{
for(int l=0;l+len-1<n;l++)
{
int r=l+len-1;
//如果符合第一种情况,子回文序列包含l,r两个结点
if(len==1) f[l][r]=1;
else
{
if(str[l]==str[r]) f[l][r]=f[l+1][r-1]+2;
f[l][r]=max(f[l][r],f[l][r-1]);
f[l][r]=max(f[l][r],f[l+1][r]);
}
}
}
cout<<n-f[0][n-1]<<endl;
return 0;
}