若給定序列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 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...