由最長公共子串行問題的最優子結構性質建立子問題最優值的遞迴關係。
用c[i][j]記錄序列x和y的最長公共子串行的長度,其中, xi=;yj=。
當i=0或j=0時,空序列是xi和yj的最長公共子串行。
故此時c[i][j]=0。其他情況下,由最優子結構性質可建立遞迴關係如下:
void lcslength( int m,int n,char *x,char *y,int **c,int **b )
//c[i][j] 記錄xi和yj 的最長公共子串行長,
//if 左上角
else if (c[i-1][j]>=c[i][j-1])
//else if 上面
else
//else 左面
} //for 第四個for
cout<
lcslength只是計算出最優值,並未給出最優解,然而陣列b可用於快速構造兩個序列的最長公共子串行:
b[i][j]=1時表示xi和yj的最長公共子串行是由xi-1和yj-1的最長公共子串行加上xi所得到的(斜);
b[i][j]=2時表示xi和yj的最長公共子串行是由xi-1和yj的最長公共子串行相同(上);
b[i][j]=3時表示xi和yj的最長公共子串行是由xi和yj-1的最長公共子串行相同。根據b的內容列印出最長公共子串行(左)。
構造最長公共子串行
void lcs(int i,int j,char *x,int **b)
{ if (i ==0 || j==0) return;
if (b[i][j]== 1){ lcs(i-1,j-1,x,b); cout
2345
6789
0000
0000
0001
0111
1111
1120
1222
2223
0122
2222
2240
1233
3333
3501
2333
3444
6012
3444
455
長度矩陣c#0
1234
5678
9000
0000
0000
1013
3313
3332
0221
1313
1130
2122
2222
2402
2113
1311
5022
2222
1336
0221
1312
11狀態矩陣b
動態規劃之最長公共子串行問題
由最長公共子串行問題的最優子結構性質建立子問題最優值的遞迴關係。用c i j 記錄序列x和y的最長公共子串行的長度,其中,xi yj 當i 0或j 0時,空序列是xi和yj的最長公共子串行。故此時c i j 0。其他情況下,由最優子結構性質可建立遞迴關係如下 void lcslength int m...
動態規劃之最長公共子串行
最長公共子串行簡介 舉例說明並分析 塊測試結果 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列,確切的說,若給定序列x 則另一串行z x的子串行是指存在乙個嚴格的下標序列,使得對於所有的j 0,1,k 1有zj xij。例如序列z 是序列x 的子串行,相應的遞增下標序列維。最長公共子串行問...
動態規劃之最長公共子串行
給出兩個字串,求出這樣的一 個最長的公共子串行的長度 子串行 中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的 先後順序一致。sample input abcfbc abfcab programming contest abcd mnp sample output 4 2 0對於動...