给出一串字符,求使该字符串是回文需要添加的最少字符个数。
输入
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; }