DP演算法 最長公共子串行

2021-07-12 06:45:37 字數 1197 閱讀 6410

#include"stdio.h"

#include"string.h"

main()

; int i,j,len1,len2;

gets(str1);

gets(str2);

len1=strlen(str1);

len2=strlen(str2);

for(i=1;i<=len1;i++) //str1為主串,str2為副串

else

else

}} }

printf("%d\n",dp[len1][len2]);

}

一、題意:求兩個字串的最長公共子串行

二、狀態轉移方程:

if(i==0||j==0) dp[i,j]=0;

else if (x[i]==y[j])  dp[i,j]=dp[i-1][j-1];

else dp[i,j]=max;

三、字元規定:

dp[i,j]表示x的前面i個字元和y的前面j個字元所構成的最長公共子串行的長度。 

dp[i-1,j-1]表示x的前面i-1個字元和y的前面j-1個字元所構成的最長公共子串行的長度。 

dp[i-1,j]表示x的前面i個字元和y的前面j個字元所構成的最長公共子串行的長度。 

dp[i,j-1]表示x的前面i個字元和y的前面j-1個字元所構成的最長公共子串行的長度。

四、思路

將x和y字元使用二維陣列存放,初始化邊界;以x為主串與y為子串進行比較。

當x[i]==y[j],表示x[i]與y[j]可以構成乙個lcs(最長公共子串行),這個時候dp[i,j]=dp[i-1][j-1],因為可能x的前i-1個字元會與y的前1、2、3。。。j-1

構成lcs,利用dp的思想我們在前面構成的lcs的基礎上加一,即dp[i,j]=dp[i-1][j-1]。

當x[i]!=y[j]時,這時dp[i,j]=max,因為x的前i-1個字元與y的前j構成的lcs與x的前i個字元與y的前j-1構成的lcs可能是不同lcs,因此我們取其中的最大值延續到dp[i,j]中,即dp[i,j]=max。

二維陣列的存放和模擬過程如下:

第一次寫dp的題,思路和表達不是很好。如有錯誤的地方,歡迎指出。+-+。。。

DP 最長公共子串行

解題報告 題目 演算法 dp 最長公共子串行 思路 最長公共子串行,英文縮寫為lcs longest common subsequence 其定義是,乙個數列 s 如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。d i j 表示s1的第i位...

最長公共子串行 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 例如,序...