動態規劃入門 例題理解

2021-08-27 08:37:39 字數 2312 閱讀 9510

動態規劃入門—例題理解

目錄

例題:搶劫街道

遞迴例項:

例題:小兵向前衝

上樓梯問題:

尋路演算法

動態規劃(dynamic programming)

前提:遞迴,暴力搜尋

通過例題理解動態規劃…

小偷搶劫一條街道的各家,要求不能搶劫相鄰兩家,否則觸發警報,問如何搶劫可以得到最多錢財。

先暴力方法(暴力方法是解決一切問題的方法)-----------à一定是遞迴

public int solve(int idx,int nums);//輸入搶到第幾家,與各家的錢數;輸出搶到的錢數

邊界條件         if(idx<0) return 0;

不搶-----------獲得下一家的錢數

選出決策中的最大值

math.max(

nums[idx]+slove(idx-2,nums)

, solve(idx-1,nums)

)           全域性最優化

從n開始,是一種習慣

時間複雜度:太高

重疊子問題:

去冗餘

----------------------

空間換時間

idx從n-1開始--à(n-3, n-4, n-5…….)

idx從n-2開始--à(n-4, n-5……..)

如何優化演算法--à減少重複計算

if(idx 算過)

直接返回結果;

解決方法:開乙個陣列存已經算過的索引idx的搶到的錢數 result

初始化陣列全為-1.

if(result[idx]>=0)

return result[idx];

其中,陣列後面的賦值result[idx] = math.max(nums[idx]+slove(idx-2,nums), solve(idx-1,nums))

後效性

貪心-----------------貪心天生沒有後效性

歸屬於動態規劃的題型:

套路:最大 最小 最優 最長 計數

離散問題:揹包問題

最優子結構:n-1可以推導出n

基本步驟

設計暴力演算法,找到冗餘

設計並儲存狀態(一維 二維 三維陣列 map)

遞迴(函式 自呼叫)/遞推(公式 for迴圈)

自底向上(n開始)/自頂向下(0開始 需要考慮前幾個idx的值取值) 計算最優解

斐波那契數列:f(n) = f(n-1) + f(n-2);

n!:        f(n) = f(n-1) *n;

n*m的棋盤  小兵從左下角->右上角 只能向上向右 問有多少種走法

套路:計數問題

解題思路:暴力搜尋(回溯法 遞迴 搜尋)

輸入(n, m)

決策:???原問題與子問題的關係

f(n, m)

:在n*m

棋盤上已經到達右上角時的走法有多少種

--------它是有哪些子問題可以推導出來呢?

(n-1, m)向右走+ (n, m-1)向上走

所以: f(n, m) = f(n-1, m) + f(n, m-1);

考慮邊界條件:if(n==0 || m==0) return 0;

if(n==1 || m==1) return 1;

拓展:組合數遞推公式c(n,r)----------------- 區分-通項公式

邊界條件: if(r==0)

if(n決策:ncr(n, r) = ncr(n-1, r-1) + ncr(n-1, r);-----------------類似小兵走斜線(斜上)與向上

全排列遞推公式

新增限制條件:

小兵在棋盤上的某格不能走---------------在那乙個新增的走法種類為0

小兵可以在乙個方向上走一步或兩步f(n, m) = f(n-1, m) + f(n, m-1) +

f(n-2, m) + f(n, m-2)

小兵可以在乙個方向上走k步

f(n, m, k)

一步可以跨一級或兩級,要上到n級,有多少種走法

f[n] = f[n-1] + f[n-2]

f[n] = f[n-1] + f[n-2] + f[n-3] +…+ f[n-k] 

單元最短路

雙元最短路

其他:八皇后問題

練題**~littlecode??

動態規劃入門

1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...

動態規劃入門

大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....

動態規劃入門

學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...