http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/D

 

题目大意:给一个长为n的字符串,问最少插入几个字符成回文串

解题思路:总长-最长公共(原来的和其倒过来的串)子序列(LCS) 

知识详解——LCS:给出两个子序列A,B,求长度最大的公共子序列(如152687和2356984——>568或268);不妨设d(i,j)为A,B的LCS,   则最有子结构为::A[i]=B[j]时,d(i,j)=d(i-1,j-1)+1;否则,d(i,j)=max{d(i-1,j),d(i,j-1)};复杂度为O(m*n),也可用滚动数组法优化。

#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int c[5005][5005]; 
int main(){
    int n; 
    for(string a,b;cin>>n>>a;){  
       
       b=a;                      //输入a并获得其颠到序列+对c[][]初始化0
       reverse(b.begin(),b.end());
       memset(c,0,sizeof(c));

       for(int j=0;j<n;j++){     //利用最优子结构求解过程
          for(int i=0; i<n; i++){  
               if(a[i]==b[j])  c[i+1][j+1]=c[i][j]+1;  
               else   c[i+1][j+1] = c[i][j+1]>c[i+1][j] ? c[i][j+1]:c[i+1][j];  
           }
       }  

       cout<<n-c[n][n]<<endl;
    }
    return 0;
}
View Code

相关文章: