矩陣鏈乘法問題
給定n個矩陣的鏈,矩陣ai的規模為p(i-1)*pi(1<=i<=n),求完全括號化方案,使得計算乘積a1a2...an所需標量乘法次數最少。
比如矩陣鏈相乘,不同的加括號方式會導致不同的計算代價。假定三個矩陣的規模為10*100、100*5、5*50。若按((a1a2)a3)計算,a1a2需要做10*100*5=5000次標量乘法(根據矩陣相乘**得出所述計算方法),再與a3相乘又需要做10*5*50=2500次標量乘法,合起來共需7500次標量乘法。若按(a1(a2a3))的順序,計算a2a3需要做100*5*50=25000次標量乘法,a1再與之相乘又需10*100*50=50000次標量乘法,合起來共需75000次標量乘法。
整體思路
為方便,用aij表示aia(i+1)...aj乘積的結果矩陣。進行括號化,也就是在某個ak和a(k+1)之間將矩陣鏈分開。所以,解決辦法就是先計算矩陣a(i...k)的計算代價,加上矩陣a(k+1...j)的計算代價,再加上兩者相乘的計算代價即為最小計算代價。
**
列印lcsmatrix-chain-order(p)
for i=1 to n //長度為1的鏈的最小計算代價為0
m[i,j]=0
for l=2 to n //l代表鏈的長度,由小到大,因為鏈長的計算依賴於較短的鏈
for i=1 to n-l+1 //根據鏈的長度計算所要求的m[i,j]中的i,i的最大值要有限定,否則有可能超出給定的矩陣鏈(比如矩陣鏈是0
//a2...a6,假定鏈長為3,那麼i最大為4,若i=5,則需要a7。)
j=i+l-1 //根據鏈的長度l和i的值計算j的值
m[i,j]=100000000 //先給定乙個比所有計算結果都大的值
for k=i to j-1 //k為可能的矩陣鏈的分割點位置
q=m[i,k]+m[k+1,j]+p(i-1)p(k)p(j) //計算對應的代價
if q
最長公共子串行問題
給定兩個序列x=和y=,求x和y長度最長的公共子串行。
偽**lcs-length(x,y)
m=x.length
n=y.length
for i=1 to m //若乙個序列長度為0,那麼lcs的長度為0
c[i,0]=0
for j=0 to n //同上
c[0,j]=0
for i=1 to m 由遞迴解計算lcs的長度
for j=1 to n
if xi==yi
c[i,j]=c[i-1,j-1]+1
b[i,j]="↖" //表示xi=yj是lcs的乙個元素
else if c[i-1,j]>=c[i,j-1]
c[i,j]=c[i-1,j]
b[i,j]="↑"
else
c[i,j]=c[i,j-1]
b[i,j]="←"
return c and b
print-lcs(b,x,i,j)
if i==0 or j==0
return 0
if b[i,j]=="↖"
print-lcs(b,x,i-1,j-1)
print xi
else if b[i,j]=="↑"
print-lcs(b,x,i-1,j)
else
print-lcs(b,x,i,j-1)
動態規劃(二)
本節實現乙個動態規劃問題實現。具體問題見上一節 的第三個栗子。這裡再次簡述 在乙個時刻系統可以觀察到的有兩個量 剩餘資料報數量m以及通道狀態h。因此我們將二者聯合組成系統狀態 m,h 那麼在每乙個時隙系統總共有2 m 1 個狀態。每乙個狀態可能跳轉到下乙個時隙的某乙個或者一些狀態。跳轉判斷條件有 在...
動態規劃(二)
之前的兩個問題都是用動態規劃方法解決的,那麼什麼情況下需要使用動態規劃呢?適應動態規劃方法求解的最優化問題應該具備的兩個要素 最優子結構和子問題重疊。用動態規劃方法求解最優化問題的第一步就是刻畫最優解的結構。如果乙個問題的最優解包含其子問題的最優解,就稱此問題具有最優子結構性質。使用動態規劃方法時,...
動態規劃(二)
本次通過兩個簡單的演算法題來進一步練習和理解動態規劃,廢話不多說,來上題吧。給出乙個陣列,如 6,1,1,9,3 在裡面取任意個數,要求所取得數的位置不能相鄰,比如取了第乙個數就不能取第二個數,但是可以取第三第四個數,求取出數之和的最大值。下面來讓我們分析一下這個題,我們可以分解成求每一位的最優解,...