動態規劃就是把一系列問題拆分成乙個乙個的子問題的過程 ,例如我們的斐波那契數列問題,可以從最後乙個序列的加減法看起,這樣就可以使用遞迴得到最後的結果了。
除了斐波那契數列,我們還有什麼問題也是dp的問題呢?
問題:給定乙個n,找到不同的n將其寫成1,3,4相加的方法。
當n=5時,答案是6,一共有6中組合方式,如下:
5=1+1+1+1+1
=1+1+3
=1+3+1
=3+1+1
=1+4
=4+1
因此我們可以從最後乙個數字看起,假設數字n一共有d(n)種組合的方式。那麼我們假設最後乙個數字我們加上的是1,則加到倒數第二個數字時有d(n-1)種組合方法,假設最後加上的是3,則有d(n-3)種方法,假設最後加上的是4,則有d(n-4)種方法。
所以我們可以得到公式:
d(n)=d(n-1)+d(n-3)+d(n-4)
這樣就可以使用遞迴求解了,遞迴的時間複雜度是2^n,就是時間複雜度有點高,**如下:
defdp(n):
if n==1:
return 1
if n==2:
return 1
if n==3:
return 2
if n==4:#
1,3 3,1 1,1,1,1 4
return 4
#1,3,4
return dp(n-1)+dp(n-3)+dp(n-4)
大家可以思考一下迭代的解法
演算法與資料結構 動態規劃
動態規劃 dp 的基本思想是 當前子問題的解可由上一子問題的解得出。動態規劃演算法通常基於由乙個遞推公式 狀態轉移方程 和若干個初始狀態 狀態 應用 1 lis longest increasing subsequence 求乙個陣列中的最長非降子串行的長度。子問題 我們可以考慮先求a 0 a 1 ...
資料結構 十二 動態規劃
動態規劃一般用於全域性問題,在構造遞迴的時候,一般採用自頂向下分解的方法,先把全域性問題分解成更小的子問題求解。下面舉兩個例子 例子1 有一座高度是10 階的樓梯,從下往上走,每跨一步可以是一級或兩級台階。要求用程式求出一共一共有多少種走法。問題分析建模 首先總共有10 步,假設只剩最後一步就到達第...
演算法與資料結構 動態規劃
用遞迴求解問題時,反覆的巢狀會浪費記憶體。而且更重要的一點是,之前計算的結果無法有效儲存,下一次碰到同乙個問題時還需要再計算一次。例如遞迴求解 fibonacci 數列,假設求第 n 位 從 1 開始 的值,c 如下 include intfib int n return fib n 1 fib n...