最長公共子串行 動態規劃

2021-07-02 11:40:28 字數 2023 閱讀 6667

關於用動態規劃法求兩個序列的最長公共子串行問題的相關知識見

王曉東《計算機演算法設計與分析》第三章。

注意,這裡所指的最長公共子串行是可以不相鄰的,與平常所說的最長公共子串(相鄰的)不一樣。

直接上**:

lcs.h

#ifndef lcs_h

#define lcs_h

class lcstring

;#endif

lcs.cpp

#include

"lcs.h"

#include

#include

using

namespace std;

#define max 50

/// lcstring::lcstring()

x = new

char[max];

y = new

char[max];

} lcstring::~lcstring()

delete  c;

delete  b;

delete  x;

delete  y;

} bool lcstring::input()

// void lcstring::lcslength()

// ③

c[i][j]=max;  (i,j>0;x[i]≠y[j])

else

if (c[i-1][j] >= c[i][j-1])

else }

}}/ void lcstring::print()

cout << endl;

} void lcstring::lcs(int i, int j, char *x, char **b)

else

if (b[i][j] == '|')

lcs(i-1,j,x,b);

else

lcs(i,j-1,x,b);

} bool lcstring::run()

else

return

false;

} int main()

執行結果(採用的是書上的例子):

該問題,由最優子結構性質建立遞迴關係如下:

(具體分析見王曉東《計算機演算法設計與分析》)

c[i,j]用來儲存x和y的最長公共子串行的長度。

注意第一種情況,相應**見上面**黃色背景處。其中,注釋掉的**是王曉東《計算機演算法與分析》一書中對應於第一種情況的**。

for (i=1;i<=n;i++)c[0][i] = 0;這行**完成的是對乙個二維陣列的列的賦值。所以這個二維陣列在被使用之前一定要初始化,否則這裡對列的賦值是不能夠成功的。在lcs.h中,c的定義是char** c,可見c是乙個二級指標,在建構函式中已經完成了對c的動態記憶體分配,但是沒有初始化,所以不能對c的列進行賦值。

那麼將c定義成char c[50][50]行不行呢?同樣也是需要先對c[50][50]進行初始化後才能對列進行賦值。但是用codeblocks(gcc)卻是可以的。為什麼呢?舉例如下:

int main()

顯然,n是沒有被初始化的,用vc++ 2008執行,會出錯,但是用codeblocks(gcc)卻可以列印出n的值。這是因為codeblocks(gcc)中,n雖然沒有被初始化,但是編譯器已經有個預設值賦給它了,所以能夠列印出n的值。因此,為了避免不必要的麻煩與錯誤,變數在使用前最好初始化。

所以,可將

for (i=1;i<=n;i++)

c[0][i] = 0;

for (i=1;i<=m;i++)

c[i][0] = 0;

替換成

for (i=0;i<=m;i++)

for (j=0;j<=n;j++)

c[i][j] = 0;

因為二維陣列c的值在整個程式中是≥0的,這樣就既完成了對二維陣列c的初始化,也完成了c[i,j]的第一種情況。

2009.12.5 sat.

最長公共子串行 動態規劃

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

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

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

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

問題描述 使用動態規劃演算法解最長公共子串行問題,具體來說就是,依據其遞迴式,自底向上的方式依次計算得到每個子問題的最優值。輸入形式 在螢幕上輸入兩個序列x和y,序列各元素數間都以乙個空格分隔。輸出形式 矩陣c,其中c i,j 中存放的是 序列xi 和序列yj 的最長公共子串行的長度。序列x和y的最...