動態規劃2 最長公共子串行

2021-09-07 11:55:13 字數 2057 閱讀 9732

最長公共子串行1:

所有的回溯找路徑:記錄之前來的路徑 

找兩個字串的最長公共子串行

char s1[maxlen]=;

char s2[maxlen]=;

答案為4

遞推公式:

回溯路徑:

最長公共子串行2:回溯法求路徑

3所有的回溯找路徑:記錄之前來的路徑

41、遞推公式:

5(分最後乙個相同和最後乙個不同來分析)

6當i或j等於0,maxlen(i,j)==0;

7當s1和s2的最後乙個字元相同時,maxlen(i,j)=maxlen(i-1,j-1)+1;

8當s1和s2的最後乙個字元不同時,maxlen(i,j) = max(maxlen(i,j-1),maxlen(i-1,j) ); 9*/

10/*

11因為區域性變數是在棧中的,所以像這樣用函式傳引數的話,陣列不能太大

12現在這裡maxlen是100,可以,是1000的話就會出問題

13解決方法:陣列可以寫成全域性變數

14*/

15 #include 16 #include 17

#define maxlen 100

18using

namespace

std;

19//

求s1和s2的最長公共子串行

20void lcslength(char *s1,char *s2,int length1,int length2,int dp[maxlen],int

pre[maxlen])

34//

當s1和s2的最後乙個字元不同時,dp(i,j) = max(dp(i,j-1),dp(i-1,j) );

35else

if(dp[i-1][j]>=dp[i][j-1])

39else

43}

4445}46

}47//列印s1和s2的最長公共子串行

48void printlcs(int pre[maxlen],char *s1,int i,int

j)57

else

if(pre[i][j]==1)61

else

65}

6667

intmain();

69char s2[maxlen]=;

70/*

71dp[maxlen][maxlen]表示進行動態規劃運算的陣列,

72dp(i,j)表示s1的左邊i個字元形成的子串,

73與s2左邊的j個字元形成的子串的最長公共子串行的長度(i,j從0開始算)

74*/

75int

dp[maxlen][maxlen];

76//

pre[i][j]用於記錄ij位置的最長公共子串行是從哪個位置推導出來的

77int

pre[maxlen][maxlen];

78int length1=strlen(s1);//

求字元陣列s1的長度

79int length2=strlen(s2);//

求字元陣列s2的長度

80 lcslength(s1,s2,length1,length2,dp,pre);//

求s1和s2的最長公共子串行

81 cout/

輸出s1和s2的最長公共子串行的長度

82 printlcs(pre,s1,length1,length2);//

列印s1和s2的最長公共子串行

動態規劃2 最長公共子串行

問題是給定字串x和y,求出兩個當中最長的公共子串行。比如x abcdef y acefg,那麼他們的最長公共子串行就是acef。就是求x的所有可能的子字串與y所有的子字串匹配,如果相同,那麼就是乙個公共子串行,然後求最長的乙個。建議 上面的公開課,講的非常好。本文思路是根據上面的公開課總結實踐的。我...

動態規劃 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上公升的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串行,也就是說要...

動態規劃 最長公共子串行

兩個序列的最長公共子序 lcs longest common length 的 每個字元可以不連續,如x y 那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到 最精髓的 狀態轉移方程 假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r i j 自底往上 那麼x i 與y...