動態規劃 最大公共子串行長度問題

2021-06-19 02:26:51 字數 1606 閱讀 5535

昨晚部門出去吃火鍋,十來個人有說有笑的,感覺很不錯,不過因此昨天的"每日一題"也就沒時間了,現在補上。

問題:有兩個字串a=a1 a2 a3 ... an和b=b1 b2 b3 ... bm,求兩者的最大公共子串行的長度,這裡的公共子串行就是相同的兩個字串中字元相同的子串行。如:abcdefg 和 acghlm的最大公共子串行是acg。

圖表分析:

/** * 動態規劃,最大公共子串行長度問題

* l[i,j] = 0;(i=0或j=0);

* l[i,j] = l[i-1,j-1]+1;(ai=bj)

* l[i,j] = max(ai!=bj)

* @author wly

* */

public class maxcommonsubsequenceproblem

public static int solve(string s1,string s2) {

char c1 = s1.tochararray();

char c2 = s2.tochararray();

int result = new int[c1.length][c2.length];

for(int i=0;i執行結果:

0 0 0 0 0 0 0 0

0 0 1 1 1 1 1 1

0 0 1 2 2 2 2 2

0 1 1 2 2 2 2 2

0 1 1 2 2 3 3 3

0 1 1 2 2 3 4 4

0 1 2 2 2 3 4 5

0 1 2 2 2 3 4 5

cdafgcu和 acdefgc的最大子串行長度是:5

下面來聊聊本人對動態規劃的一點淺顯的想法,權當拋磚引玉只用,高手莫噴。在動態規劃問題中有:

1、這一次的選擇將影響下一次的選擇。比如01揹包問題中可能因為這一次放了乙個很大的物體,導致了下乙個物體沒有足夠的空間放置。那麼到底放還是不放下乙個物體,代表了兩個解,取更優解儲存。

2、將本次之前的"所有可能成為全域性最優解的子問題解"快取起來。下一階段的選擇就是基於當前階段快取起來的最優子問題解集合的。然後將本階段快取起來的最優子問題解和下一階段的所有解元素合成,得到下一階段的最優子問題解的快取,如此迭代,直到得到全域性最優解。如此便保證了當前階段快取起來的解結合都是可能成為全域性最優解的解。同時全域性最優解必定包含這些解中的乙個。直到最後乙個子階段,從中選出最優解,該最優解即是全域性最優解。

3、動態規劃的核心就是子問題解的快取及復用,從而減少演算法的計算量。

4、需要注意的設計合適的子問題分解方式是乙個"創造性"過程。這裡的子問題分解方式其實就是所謂的狀態轉移方程了,尋找這個狀態轉移方程的過程是乙個創造性的過程。

原來用腦袋想起來很複雜的問題,用狀態轉移公式解起來這麼簡單。但是需要學習的能力就是推導狀態轉移公式的能力,這就好透徹的理解動態規劃的思想了。理解動態規劃中"解集合的快取"及復用。

o啦~~~

謝謝!!

java 動態規劃最大公共子串行問題

剛開始按照自己的思路寫出來結果是不多了,而且還出現了陣列越界異常,在一點點的修改下,終於對了,但是還有很多可以改進的地方 package first 最長公共子串行 public class lcs string b new string int m a.length int n b.length ...

動態規劃查詢最大公共子串行

使用二維陣列c m,n c i,j 記錄序列xi和yj的最長公共子串行的長度 當i 0或j 0時,空序列是xi和yj的最長公共子串行,故c i,j 0 以上x和y進行一 一對比,a和b不相等,則比較它的左邊那個數和上邊那個數他們兩誰大 a和d比較,不相等,同理 直達a和a相比,相等,則它的左上角那個...

SDUT 最長公共子串行長度 動態規劃

time limit 1000 ms memory limit 65536 kib submit statistic problem description 給定兩個序列x input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文本母 a,z 表示序列x和y。out...