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

2021-06-16 07:53:55 字數 1386 閱讀 2873

由最長公共子串行問題的最優子結構性質建立子問題最優值的遞迴關係。

用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對於動...