(疑)最長公共子串行(動歸和遞推)

2021-09-20 07:14:33 字數 706 閱讀 5090

方法一:使用動態規劃

分兩種情況:

(1)a[i]=b[i],則字串a和字串b的lcs增加了一位,即有dp[i][j]=dp[i-1][j-1]+1;

(2)a[i]!=b[i],那麼字串a的i號位和字串b的j號位之前的lcs無法延長了,因此dp[i][j]就會繼承dp[i-1][j]和dp[i][j-1]裡的最大值

邊界:dp[i][0]=dp[0][j]=0;

//邊界這裡不太懂

//邊界:dp[i][0]=dp[0][j](0<=i<=n,0<=j<=m)

#include#include#include#include#includeusing namespace std;

const int n=100;

int dp[n][n];//用於存放結果,也就是最大值

char a[n],b[n];

int main()

for(int j=0;j<=lenb;j++)

//狀態轉移方程

//為什麼是從1開始數???????

for(int i=1;i<=lena;i++)

else

}} printf("%d\n",dp[lena][lenb]);

return 0;

}

方法二;課本講的遞迴回溯法

最長公共子串行 動態規劃

經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是動態規劃法所...

最長公共子串行 動態規劃

關於用動態規劃法求兩個序列的最長公共子串行問題的相關知識見 王曉東 計算機演算法設計與分析 第三章。注意,這裡所指的最長公共子串行是可以不相鄰的,與平常所說的最長公共子串 相鄰的 不一樣。直接上 lcs.h ifndef lcs h define lcs h class lcstring endif...

最長公共子串行(動態規劃)

定義 乙個數列 如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 稱為已知序列的最長公共子串行。考慮最長公共子串行問題如何分解成子問題,設a a0,a1,am 1 b b0,b1,bm 1 並z z0,z1,zk 1 為它們的最長公共子串行。不難證明有以下性質 1 如果am ...