最长公共子序列
Posted ltlt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长公共子序列相关的知识,希望对你有一定的参考价值。
#include"iostream" #include"cstdio" #include"algorithm" #include"cstring" #define N 500 using namespace std; int lcs[N][N];//lcs[x][y]表示 串1的第一位的到x,串2的第一位到y的最长子序列; char s1[N],s2[N]; int main() { while(~scanf("%s",s1)) { scanf("%s",s2); //cout<<s1<<" "<<s2<<endl; int l1=strlen(s1),l2=strlen(s2); for(register int i=0;i<=l1;++i) { for(register int j=0;j<=l2;++j) { if(i==0||j==0) lcs[i][j]=0;//初始化因为当lcs[0][0] i=0,表示串1长度为0,当串1为0;不可能就有公共子序列(!!关键) //同样 j=0,表示j=0,那么同样公共子序列为0; else if(s1[i-1]==s2[j-1])//因为先++l,但是字符串从0开始所应该判断是否s1[i-1],s2[j-1] { //意思是判断是串1 i-1位,串2 j-1位是否相同 lcs[i][j]=lcs[i-1][j-1]+1;//如果相同那么当前状态的lcs[i][j] //就应该是两个串的前一个位置lcs[i-1][j-1]最长子序列+1; } else lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]);//如果是串1 i-1位与串2 j-1位,那么现在状态lcs[i][j]的 //最长子序列就应该由上个状态 //lcs[i-1][j]和lcs[i][j-1]中转移过来 } } cout<<lcs[l1][l2]<<endl;//最后答案应该存在末状态中; } return 0; }
#include"iostream"#include"cstdio"#include"algorithm"#include"cstring"#define N 500using namespace std;int lcs[N][N];//lcs[x][y]表示 串1的第一位的到x,串2的第一位到y的最长子序列; char s1[N],s2[N];int main(){while(~scanf("%s",s1)){ scanf("%s",s2);//cout<<s1<<" "<<s2<<endl;int l1=strlen(s1),l2=strlen(s2);for(register int i=0;i<=l1;++i) { for(register int j=0;j<=l2;++j) { if(i==0||j==0) lcs[i][j]=0;//初始化因为当lcs[0][0] i=0,表示串1长度为0,当串1为0;不可能就有公共子序列(!!关键) //同样 j=0,表示j=0,那么同样公共子序列为0; else if(s1[i-1]==s2[j-1])//因为先++l,但是字符串从0开始所应该判断是否s1[i-1],s2[j-1] { //意思是判断是串1 i-1位,串2 j-1位是否相同 lcs[i][j]=lcs[i-1][j-1]+1;//如果相同那么当前状态的lcs[i][j] //就应该是两个串的前一个位置lcs[i-1][j-1]最长子序列+1; } else lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]);//如果是串1 i-1位与串2 j-1位,那么现在状态lcs[i][j]的 //最长子序列就应该由上个状态 //lcs[i-1][j]和lcs[i][j-1]中转移过来 } } cout<<lcs[l1][l2]<<endl;//最后答案应该存在末状态中; } return 0;}
以上是关于最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章