题目

image-1670762207369

题解

回文串是成对出现的,所以要增加一些种子变成回文串等价于从当前这个状态的最长回文串需要删除多少个,即n-最长回文串的长度。
例如:ABDCDCBABC
需要增加三个成为:CBABCDCDCBABC
增加的这三个其实可以由ABDCDCBABC删除三个种子,得到最长回文串一样的操作次数。

#include<iostream>
#include<cstring>
using namespace std;
const int N=1010;
int f[N][N];
char s[N];

int main(){
    cin>>s;
    int n=strlen(s);
    for(int len=1;len<=n;len++){
        for(int l=0;l+len-1<n;l++){
            int r=l+len-1;
            if(len==1)f[l][r]=1;
            else{
                if(s[l]==s[r])f[l][r]=f[l+1][r-1]+2;
                if(f[l][r-1]>f[l][r])f[l][r]=f[l][r-1];
                if(f[l+1][r]>f[l][r])f[l][r]=f[l+1][r];
            }
        }
    }
    cout<<n-f[0][n-1]<<endl;
    
    return 0;
}