動態規劃解最長公共子串行問題bug

2021-06-27 01:34:45 字數 814 閱讀 4994

昨天寫動態規劃解最長公共子串行問題是出錯了,糾結了我一天,浪費了好多時間。問題是這樣的,源**:

#include#include#includeusing namespace std;

int a[1001][1001];

char s1[1000],s2[1000];

int max(int x,int y)

int main()

}cout<

這是執行結果,就是有時計算出的最長公共子串行長度少1,照著別人的正確**改了半天都沒發現錯誤,後來才發現是上面**的紅字部分,i和j的位置放反了。

首先從知識的角度來說,有幾個問題:

1.對於陣列的行列關係和賦值方式沒有弄得很清楚

2.對於字串和陣列之間對應的邏輯關係也沒想清楚

這裡應該明白首先有兩個字串s1和s2,他們的長度分別是long1和long2,然後我們現在需要建立乙個二維陣列來記錄每個字串各個字首序列間的公共子串行長度,也就是要建立乙個array[long1][long2]形式的陣列,二維陣列的第乙個引數表示的是行數,第二個引數表示的是列數,這個陣列的行數也就對應著s1的各個字元,這個陣列的列數也就對應著s2的各個字元,然後給陣列賦值時,也就要根據s1[i]和s2[j]是否相等來給array[i+1][j+1]賦值,而我的程式正好反了,還是要把每個變數和數字對應的東西搞清楚;還有就是給二維陣列賦值是乙個兩層巢狀的迴圈,我們要清楚第一層迴圈是0到long1,對應的是s1的每個前序列,i表示的是二維陣列的行數,第二層迴圈是0到long2,對應的是s2的每個前序列,j表示的是二維陣列的列數,可能就是因為問題一複雜,又加上什麼迴圈之類的就搞錯了。

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

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

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

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

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

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