最少添加几个字符使得字符串变成回文串(可在任意位置插入)
#include<bits/stdc++.h>
using namespace std;
int main(){
string str; cin>>str; //输入串
int len = str.length(); //读出串长
int dp[len][len]; //dp[i][j]表示i到j之间的字符串要成为回文串所需要增加的最小字符数
for(int k=2;k<=len;k++){//k表示相隔的长度
for(int i=0;i+k-1<len;i++){ //枚举左界
int j=i+k-1; //得到右界
if (str[i]==str[j])dp[i][j]=dp[i+1][j-1];//左右界相同则当前DP值加1
else dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1;//在前面或者后面添加一个字符
} //关键就是在这里,并没有真正的加进去,而且是加在左边还是右边也没判断
} //只是求了操作步数!这样对整个串的下标都没有什么影响
cout<<dp[0][len-1];//输出串长
return 0;
}
/*
in abcbd
out 2
*/