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 ...