最长公共子序列(动态规划)

2015-01-27 06:07:12 · 作者: · 浏览: 8
#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        using namespace std; /* *最长公共子序列(动态规划) */ vector
       
        > c;//c[i][j]记录串a[0..i]与串b[0..j]之间的最长公共子序列的长度 vector
        
         > b;//b[i][j]记录c[i][j]的值是由哪一个子问题的解得到的 void LCSLength(string m,string n) { //初始化c、b数组 c = vector
         
          >(m.length()+1,vector
          
           (n.length()+1,0));//0行0列空余 b = vector
           
            >(m.length()+1,vector
            
             (n.length()+1,0)); //构造数组C for (unsigned i = 1; i <= m.length() ; i++) for (unsigned j = 1; j <= n.length(); j++) { if(m[i-1]==n[j-1]) {c[i][j] = c[i-1][j-1]+1;b[i][j] = 1;} else { if (c[i-1][j]>=c[i][j-1]) { c[i][j] = c[i-1][j];b[i][j] = 2; } else { c[i][j] = c[i][j-1];b[i][j] = 3; } } } } void PrintRes(string m,int i,int j) { if(i == 0 || j == 0) return; if(b[i][j] == 1) { PrintRes(m,i-1,j-1); cout<
             
>a; cin>>b; //计算最长公共子序列的集合 LCSLength(a,b); cout<<"最长公共子序列为:"<