演算法5 動態規劃

2021-10-05 23:00:13 字數 1641 閱讀 9339

若給定序列x=,則另一串行z=,是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j=1,2,…,k有:zj=xij。

例如,序列z=是序列x=的子串行,相應的遞增下標序列為。

給定2個序列x和y,當另一串行z既是x的子串行又是y的子串行時,稱z是序列x和y的公共子串行。

給定2個序列x=和y=,找出x和y的最長公共子串行。

1.最長公共子串行的結構

設序列x=和y=的最長公共子串行為z= ,則

若xm=yn,則zk=xm=yn,且zk-1是xm-1和yn-1的最長公共子串行。

若xm≠yn且zk≠xm,則z是xm-1和y的最長公共子串行。

若xm≠yn且zk≠yn,則z是x和yn-1的最長公共子串行。

2個序列的最長公共子串行包含了這2個序列的字首的最長公共子串行。

最長公共子串行問題具有最優子結構性質。

2.子問題的遞迴結構

由最長公共子串行問題的最優子結構性質可知,要找出x和y的最長公共子串行,可按以下方式遞迴地進行:

當xm=yn時,找出xm-1和yn-1的最長公共子串行,然後在其尾部加上xm(=yn)即可得x和y的乙個最長公共子串行。

當xm≠yn時,必須解兩個子問題,即找出xm-1和y的乙個最長公共子串行及x和yn-1的乙個最長公共子串行。這兩個公共子串行中較長者為x和y的乙個最長公共子串行。

用c[i][j]記錄序列和的最長公共子串行的長度。

xi=;yj=。

當i=0或j=0時,空序列是xi和yj的最長公共子串行。故此時c[i][j]=0。

其它情況下,由最優子結構性質可建立遞迴關係如下:

3.計算最優值

#define num 100

int c[num]

[num]

;int b[num]

[num]

;void lcslength (

int m,

int n,

const

char x,

char y)

//↖else

if(c[i-1]

[j]>=c[i]

[j-1])

//↑else

//←}

}

4.構造最長公共子串行

void

lcs(

int i,

int j,

char x)

else

if(b[i]

[j]==2)

lcs(i-

1,j,x)

;else

lcs(i,j-

1,x)

;}

給定由n個整數(包含負整數)組成的序列a1,a2,…,an,求該序列子段和的最大值。

當所有整數均為負值時定義其最大子段和為0。

演算法

#define num 1001

int a[num]

;int

maxsum

(int n)

return sum;

}

動態規劃5

名名的媽媽從外地出差回來,帶了一盒好吃又精美的巧克力給名名 盒內共有 n 塊巧克力,20 n 0 媽媽告訴名名每天可以吃一塊或者兩塊巧克力。假設名名每天都吃巧克力,問名名共有多少種不同的吃完巧克力的方案。例如 如果n 1,則名名第1天就吃掉它,共有1種方案 如果n 2,則名名可以第1天吃1塊,第2天...

演算法 動態規劃

動態規劃 把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解 演算法例子 1.鋼條切割 serling 公司購買長鋼條,將其切割為短鋼條,切割工序假設沒有成本支出,公司管理層希望確定最佳的切割方案。假設serling公司 一段長度為i英吋的鋼條的 為pi。鋼條的長度為整英吋,下表給出...

演算法 動態規劃

1 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質。比如說在揹包問題中,最高總價值 max 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...