
有必定規律可循,找套路.git
什麼是動態規劃.
有多少種方式走到右下角(這才能夠用動態規劃)
輸出全部走到右下角的路徑(dfs 遞歸)github

題目分類:
- 計數
有多少種方式走到右下角
有多少種方法選出K個數使得和是sum算法
- 求最大最小值
從左下角走到右下角路徑的最大數值和
最長上升子序列長度數組
- 求存在性
取石子游戲,先手是否必贏
能不能選出K個數使得和是Sumspa

coin change

有3中硬幣,面值:2元,5元,7元,每種硬幣足夠多3d
買一本書須要27元.blog
如何用最少的硬幣組合正好付清,不須要對方找錢.(求最大最小值)遞歸
先不考慮動態規劃:
直覺:
儘可能用大的硬幣,最後若是能夠用一種硬幣付清就行.遊戲

用直覺的答案是錯誤的.ip
動態4步走:
1. 肯定狀態(定海神針)

遞歸解法:

遞歸算法分析:

現象:
- f(20) 重複算了3次
- f(15) 重複算了2次
結果:
冗餘重複計算作了不少,效率低下.
如何避免?
- 將計算結果保存下來
- 並改變計算的順序.
-
2. 轉移方程
- 設狀態f[X] = 最少用多少枚硬幣拼出X (方括號是表示數組)
- 對於任意X:
- 到這裏,動態規劃問題已經解決了一半.

3. 初始條件 和 邊界問題
肯定好轉移方程後,須要肯定初始條件和 邊界問題.
- f[27] = min{f[27-2]+1,f[27-5]+1,f[27-7]+1} +1
- 兩個問題: X-2,X-5, 或者 X-7 小於0 怎麼辦?何時停下來?
-
若是不能拼出Y,就定義f[Y]=正無窮
- 例如f[-1]=f[-2]=正無窮
- 在實際操做中,不會真的開f[-1]
- 因此 f[1]= min{f[-1]+1,f [-4]+1,f[-6]+1}= 正無窮,表示拼不出 1
- 初始條件: f[0] = 0
4. 肯定計算順序
- 初始條件: f[0]= 0
- 而後按遞增順序計算 f[1],f[2],f[3]....(通常都是遞增計算)
- 好處: 但咱們計算f[X]時,f[X-2],f[X-5],f[X-7]都已經獲得結果了,避免了重複計算

時間複雜度:
O(n)= n

總結:
- 求最值類型優先考慮動態規劃.
-
肯定狀態
- 最後一步: 最優策略中使用的最後一枚硬幣ak
- 轉化成子問題:最少的硬幣拼出更小面值27-ak
- 肯定轉移方程:f[X] = min{f[X-2]+1,f[X-5]+1,f[X-7]+1} +1
- 肯定初始條件 和邊界狀況: f[0]=0;沒法拼出,F[X] = 正無窮
- 肯定計算順序: f[0]-->f[1]-->f[2]....
個人滴滴雲專屬AI大師碼:3388,
購買滴滴雲GPU等AI產品輸入大師碼享9折優惠。
點擊
www.didiyun.com前往滴滴雲官網購買
本篇文章由一文多發平臺ArtiPub自動發佈