1 6動態規劃

2021-10-07 18:19:12 字數 1732 閱讀 7918

int

fib(n)

複雜度t(n)=t(n-1)+t(n-2)+1,t(0)=t(1)=1

令s(n)=[t(n-1)+1]/2

則邊界條件s(0)=1=fib(1),s(1)=1=fib(1)

易得s(n)=s(n-1)+s(n-2)+1=fib(n+1)

可知t(n)=2*fib(n+1)-1=o(fib(n+1))=o(φn)=o(2n)

t(n)=o(2n)

φ=(1+根號2)/2=1.61803

記φ36=225, φ43=230=1e9,主流計算機中約1s

φ5=10,

為了解決上述問題在自頂而下遞迴時的複雜度問題,改為自底而上的迭代:

int f=

0,g=1;

while(0

)

複雜度為o(1)。

子串行:由序列中若干字元,按照相對次序構成

最長公共子串行可能有多個,也可能有歧義。

序列a[0,n]、b[0,m]、lcs(a,b)

遞迴基:n,m=-1,取做空序列

減而治之:若a[n]=『x』=b[m],則取作

lcs

(a[0

,n-1

],b[o,m-1]

)+'x'

分而治之:若a[n]!=b[m]

return

lcs(a[o,n]

,b[0

,m-1])

.size()

>

lcs(a[o,n-1]

,b[0

,m])

.size()

?lcs

(a[o,n]

,b[0

,m-1])

:lcs

(a[o,n-1]

,b[0

,m])

;

課程中並未給出具體**,這裡給出僅供參考:

#include

#include

using

namespace std;

string lcs

(char a,

char b,

int n,

int m)

else

}int

main()

與fib函式類似,仍有大量重複遞迴,,因此也可採用迭代方式:

假想的將所有問題列成一張表,從lcs(a[0],b[0])出發依次計算所有項

課程中依舊沒有給出**,我嘗試寫了一下,這個**只能解決只有乙個解的問題,當出現多個解時,便會出現錯誤,有待優化。

#include

#include

#include

using

namespace std;

void

lcs(string a, string b)}

string c="";

int k=0;

for(

int i=

0;i}

cout << c << endl;

}int

main()

動態規劃練習16 踩方格

題目簡要 描述有乙個方格矩陣,矩陣邊界在無窮遠處。我們做如下假設 a.每走一步時,只能從當前方格移動一格,走到某個相鄰的方格上 b.走過的格仔立即塌陷無法再走第二次 c.只能向北 東 西三個方向走 請問 如果允許在方格矩陣上走n步,共有多少種不同的方案。2種走法只要有一步不一樣,即被認為是不同的方案...

NYOJ 16 矩形巢狀(動態規劃)

矩形巢狀 時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a參考最長上公升子串行長度 狀態轉移方程dp i max dp i dp j 1 include include ...

NYOJ 16 矩形巢狀(動態規劃)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a 輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 ...