動態規劃入門—例題理解
目錄
例題:搶劫街道
遞迴例項:
例題:小兵向前衝
上樓梯問題:
尋路演算法
動態規劃(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 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...