[动态规划]求回文串添加最少字符
给出一串字符,求使该字符串是回文需要添加的最少字符个数。
输入
5
Ab3bd
输出
2
思路
假设串长为n,dp[i][j]表示i到j的字符串需要添加的字符数,i初始为1,j初始为n。此时要是ij相等,那就i++,j--即可。若ij不等,让dp[i][j-1]和dp[i+1][j]中小的+1,这样S[i]orS[j]对称,然后我们求得的是正逆序串的最大长,所以用总串长减去正逆序最大公共序列即可。用unsigned short存,5010*5010正常开爆内存。
#include<bits/stdc++.h>
using namespace std;
char a[5010],b[5010];
unsigned short m[5010][5010];
int main(){
int n,i,j;
while(cin>>n){
for(i=1;i<=n;i++){
cin>>a[i];
b[n-i+1]=a[i];
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i]==b[j])
m[i][j]=m[i-1][j-1]+1;
else
m[i][j]=max(m[i-1][j],m[i][j-1]);
cout<<n-m[n][n]<<endl;
}
return 0;
}

浙公网安备 33010602011771号