• 整理的一些模版LCS(连续和非连续)


        对于连续的最大串,我们称之为子串....非连续的称之为公共序列..

    代码:

    非连续连续

     1 int LCS(char a[],char b[],char sav[]){
     2     int lena=strlen(a);
     3     int lenb=strlen(b);
     4     int i,j;
     5      vector<vector<int> >mat(lena+1);
     6     for(int i=0;i<=lena;i++)
     7       mat[i].resize(lenb+1,0);
     8     for(i=1;i<=lena;i++){
     9       for(j=1;j<=lenb;j++){
    10         if(a[i-1]==b[j-1])
    11           mat[i][j]=mat[i-1][j-1]+1;
    12         else
    13           mat[i][j]=max(mat[i-1][j],mat[i][j-1]);
    14         }
    15     }
    16     i=lena-1;
    17     j=lenb-1;
    18     int k=0;
    19  while(i!=-1&&j!=-1) {
    20     if(a[i]==b[j]){
    21        sav[k++]=a[i];
    22         i--;
    23         j--;
    24   }
    25   else{
    26     if(mat[i+1][j+1]==mat[i][j]){
    27         i--;
    28         j--;
    29    }
    30    else{
    31     if(mat[i][j+1]>=mat[i+1][j]) i--;
    32      else j--;
    33    }
    34   }
    35  }
    36  return k;
    37 }
    View Code

    连续子串

    代码:

     1 int LCS(char a[],char b[],char sav[]){
     2     int lena=strlen(a);
     3     int lenb=strlen(b);
     4     int i,j,k=0,x=0;
     5     vector<vector<int> >lcs(lena+1);
     6     for(int i=0;i<=lena;i++)
     7       lcs[i].resize(lenb+1,0);
     8     for(i=1;i<=lena;i++){
     9       for(j=1;j<=lenb;j++)
    10         if(a[i-1]==b[j-1]){
    11            lcs[i][j]=lcs[i-1][j-1]+1;
    12            if(k<lcs[i][j]){
    13                x=i;
    14                k=lcs[i][j];
    15            }
    16         }
    17     }
    18     strncpy(sav,a+(x-k),k);
    19     return k;
    20 }
    View Code
  • 相关阅读:
    Android教程 -07 Activity的任务栈和启动模式
    ViewPager封装工具类: 轻松实现APP导航或APP中的广告栏
    hdu 5900 区间dp
    状压dp入门
    poj 3280
    hdu 4745 two Rabits
    食了智,过来水一发
    poj 2142 the Balance
    hdu 6188 Duizi and Shunzi
    hdu 6186 CS Course
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3935917.html
Copyright © 2020-2023  润新知