大二(下)演算法與設計 動態規劃法

2021-09-22 08:26:15 字數 2141 閱讀 5517

內容:用動態規劃法實現求兩序列的最長公共子串行。

要求:掌握動態規劃法的思想,及動態規劃法在實際中的應用;分析最長公共子串行的問題特徵,選擇演算法策略並設計具體演算法,程式設計實現兩輸入序列的比較,並輸出它們的最長公共子串行。

#include

#include

using namespace std;

intconst maxlen =50;

class lcs

intlcslength()

;void

clcs()

private:

void

clcs

(int i,

int j)

;int

(*c)

[maxlen],(

*s)[maxlen]

;int m, n;

char

*a,*b;};

int lcs:

:lcslength()

//時間複雜度:o(m×n)

else

if(c[i -1]

[j]>= c[i]

[j -1]

)else}}

return c[m]

[n];

}void lcs:

:clcs

(int i,

int j)

else

if(s[i]

[j]==2)

clcs

(i -

1, j)

;else

clcs

(i, j -1)

;}intmain()

1.對於線性規劃求最長公共字序列的優化:

備忘錄方法是動態規劃法的乙個變種,它採用分治法思想,自頂向下直接遞迴求最優解。但與分治法不同的是,備忘錄方法為每個已經計算的子問題建立備忘錄,即儲存子問題的計算結果以備需要時應用,從而避免子問題的重複求解。改寫當前的int lcslength()函式,用備忘錄方法來求解最長公共子串行。

int lcs:

:lcslength

(int i,

int j)

elseif(

lcslength

(i -

1, j)

>=

lcslength

(i, j -1)

)else

}return c[i]

[j];

}

請編寫乙個類似的clcs演算法實現。不借助二維陣列s在o(m+n)的時間內構造最長公共子串行的功能。

void lcs:

:clcs

(int i,

int j)

else

}

3.如果只需計算最長公共子串行的長度,而無須構造最優解,則如何改進原有程式可以使得演算法的空間需求大大減少?

請改寫原程式,使演算法的空間複雜度減少為o(min)。

#include

#include

#include

using namespace std;

#define max 50

class lcs

else

c1 = new int

[s +1]

; c2 = new int

[s +1]

;memset

(c1,0,

sizeof

(c1));

memset

(c2,0,

sizeof

(c2));

}int

lcslength()

;private:

int m, n;

int*c1,

*c2;

int l, s;

char

*a,*b;};

int lcs:

:lcslength()

for(

int j =

0; j < s; j++

) c1[j]

= c2[j];}

return c2[s];}

intmain()

演算法(一) 動態規劃法

使用乙個二維陣列 val i j 存放當前容量下的最大價值,其中第 i 行表示可選物品中加入 第 i 個物品,j 為當前揹包的假設容量,val i j 表示假設當前的揹包的最大容量為 j 在可選的物品中加入第 i 個物品後,揹包能裝入的物品的最大價值,val i j 值的選取方法如下 初始化第 0 ...

插花問題的「動態規劃法」演算法

q i j max q i 1 j 1 p i j q i j 1 newv v for i f i 0 i return q f v 鮮花問題 最長子串問題 define n 100 char a n b n str n 計算兩個序列最長公共子串行的長度 int get longsubstr le...

演算法設計與分析 01揹包問題(動態規劃法解決)

演算法設計與分析 01揹包問題 動態規劃法解決 這個學期開的演算法設計與分析課程老師說是研究生才要學的課,但是我們大二就要學!上機課題目有一道0 1揹包的問題,上課的時候由於沒有聽課。所以只有自己再啃書本了。雖然不長,但是還是。很有。技術含量的。本人文筆不是很好,所以就 不多說啦!直接上菜!問題描述...