DP 最長公共子串行

2021-06-12 00:04:21 字數 694 閱讀 2989

/*

解題報告

題目:演算法:dp 最長公共子串行

思路:最長公共子串行,英文縮寫為lcs(longest common subsequence)。其定義是,乙個數列 s ,如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。

d[i][j]表示s1的第i位和s2的第j位之前的最長公共子串行長度.

轉移方程:

d[i][j]=d[i-1][j-1]+1 (s1[i-1]==s2[j-1])

d[i][j]=max(d[i-1][j],d[i-1][j-1],d[i][j-1]) (s1[i-1]!=s2[j-1])

然而實際上

d[i][j]=max(d[i-1][j],d[i][j-1]) (s1[i-1]!=s2[j-1])

即可因為dp[i-1][j-1] 必定小於等於dp[i-1][j],dp[i][j-1]

因為dp[i-1][j-1] => dp[i-1][j],dp[i][j-1];

*/#include

#include

#define n 1010

int dp[n][n];

int max(int a,int b)

int main ()

printf("%dn",dp[len1][len2]);

}return 0;

最長公共子串行 DP

有序子串行定義 若x 則它的子串行為y 即原序列調出若干項組成的序列且下標要求有序。lcs 最長公共子串行 定義 給定兩個序列x 和y 存在乙個嚴格遞增的x的下標序列為,對所有的j 1,2,3.k,滿足xi yj,例如x 1 4 3 2 5 y 4 3 5 7 則x和y的最長公共子串行為 4 3 5...

最長公共子串行 DP

最長公共子串行 lcs.pas c cpp 問題描述 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列x x1,x2,xm 則另一串行z z1,z2,zk 是x的子串行是指存在乙個嚴格遞增的下標序列 i1,i2,ik 使得對於所有j 1,2,k有 xij zj 例如,序...

最長公共子串行 DP

演算法老師的作業,一道dp基礎題,給你兩個序列,問你最長公共子串行是什麼,比如 a,b 是 a,c,d,b 的子串行。注意不是最長公共子串,這裡的子串行可以不連續。兩個for迴圈就出來了,每乙個dp i j 可以從dp i 1 j 1 dp i 1 j dp i j 1 三種情況更新過來,取個最大的...