求两个数组的最长公共子序列(LCS)

    xiaoxiao2021-03-26  30

    求两个数组的最长公共子序列(LCS)

    样例

    输入:

    5 5 1 3 2 0 3 1 0 2 3 3

    输出:

    3

    求两个数组的最长公共子序列,思路其实很简单,

    两个数组s[i],t[i]。f[i][j]表示s[1~i]和t[1~j]的最长公共子序列,

    然后如果s[i]==t[j]那么这一位可以加进最长公共子序列,即if(s[i]==s[j]){f[i][j]=f[i-1][j-1]+1};

    如果不等于f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]);

    初始化 :

    for(i=0; i<=lens; i++) f[i][0]=0; for(j=0; j<=lent; j++) f[0][j]=0;

    最后输出结果f[lens][lent];

    不多说了,附代码:

    #include<bits/stdc++.h> using namespace std; int f[10001][10001]; int s[10001],t[10001]; int MAX(int x,int y) { if(x>y) return x; return y; } int main() { int lens,lent,i,j; scanf("%d%d",&lens,&lent); for(i=1; i<=lens; i++) scanf("%d",&s[i]); for(j=1; j<=lent; j++) scanf("%d",&t[j]); for(i=0; i<=lens; i++) f[i][0]=0; for(j=0; j<=lent; j++) f[0][j]=0; for(i=1; i<=lens; i++) { for(j=1; j<=lent; j++) { if(s[i]==t[j]) { f[i][j]=f[i-1][j-1]+1; } else { f[i][j]=MAX(f[i-1][j],MAX(f[i][j-1],f[i-1][j-1])); } } } printf("%d\n",f[lens][lent]); return 0; }

    PS:

    (最长公共子串的思路是一样的)

    转载请注明原文地址: https://ju.6miu.com/read-661573.html

    最新回复(0)