內容:用動態規劃法實現求兩序列的最長公共子串行。
要求:掌握動態規劃法的思想,及動態規劃法在實際中的應用;分析最長公共子串行的問題特徵,選擇演算法策略並設計具體演算法,程式設計實現兩輸入序列的比較,並輸出它們的最長公共子串行。
#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揹包的問題,上課的時候由於沒有聽課。所以只有自己再啃書本了。雖然不長,但是還是。很有。技術含量的。本人文筆不是很好,所以就 不多說啦!直接上菜!問題描述...