[动态规划]求回文串添加最少字符

给出一串字符,求使该字符串是回文需要添加的最少字符个数。

输入

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;
}

  

猜你喜欢

转载自www.cnblogs.com/crisp/p/9832390.html