這都還不懂動態規劃,那就沒轍了

有必定規律可循,找套路.git


什麼是動態規劃.

有多少種方式走到右下角(這才能夠用動態規劃)
輸出全部走到右下角的路徑(dfs 遞歸)github


題目分類:

  1. 計數
    有多少種方式走到右下角

有多少種方法選出K個數使得和是sum算法

  1. 求最大最小值

從左下角走到右下角路徑的最大數值和
最長上升子序列長度數組

  1. 求存在性

取石子游戲,先手是否必贏
能不能選出K個數使得和是Sumspa


coin change

有3中硬幣,面值:2元,5元,7元,每種硬幣足夠多3d

買一本書須要27元.blog

如何用最少的硬幣組合正好付清,不須要對方找錢.(求最大最小值)遞歸

先不考慮動態規劃:
直覺:
儘可能用大的硬幣,最後若是能夠用一種硬幣付清就行.遊戲


用直覺的答案是錯誤的.ip

動態4步走:

1. 肯定狀態(定海神針)

  • 解動態規劃須要開一個數組,數組每一個元素f[i]活着fi 表明什麼

    • 相似於解數學中,X,Y,Z表明什麼(狀態)
  • 肯定狀態須要兩個意思:

    • 最後一步

      • 雖然不知道最優策略是什麼,可是最優策略確定是K枚硬幣a1,a2,....ak 面值加起來是27
      • 因此必定有一枚最後硬幣:ak
      • 除掉這枚硬幣,前面硬幣的面值加起來是27-ak
      • 咱們不關心 K-1枚硬幣是如何拼出27-ak的(多是1種拼法,可能有100種拼法),並且咱們如今甚至還不清楚ak和k,可是咱們肯定前面的硬幣拼出了27-ak(最後一步,不肯定中有肯定的)
      • 關鍵: 由於是最優策略,由於拼出27-ak的硬幣數必定要最少,不然就不是最優策略了. 不考慮最後一枚硬幣,剩下硬幣的拼法也是最優策略.
    • 子問題:

      • 於是,最少用多少硬幣能夠拼出27-ak
      • 原來的問題是用多少枚硬幣拼出27
      • 咱們將原問題轉換成子問題,並且規模更小: 27-ak
      • 爲了簡化定義,咱們設f(X)= 最少用多少枚硬幣拼出X
    • 即便分析了 最後一步,以及子問題,但仍然不知道最後一枚硬幣 ak是多少
    • 最後一枚硬幣ak 只多是2,5,7

      • 若是ak=2,f(27)= 應該是f(27-2)+1
      • 若是ak=5,f(27)= 應該是f(27-5)+1
      • 若是ak=7,f(27)= 應該是f(27-7)+1
      • 除此以外,沒有其餘可能了.
      • 須要求最少的硬幣數:
      • f(27) = min{f(27-2)+1,f(27-5)+1,f(27-7)+1} +1

遞歸解法:

遞歸算法分析:


現象:

  • f(20) 重複算了3次
  • f(15) 重複算了2次

結果:

冗餘重複計算作了不少,效率低下.

如何避免?

  1. 將計算結果保存下來
  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

總結:

  1. 求最值類型優先考慮動態規劃.
  2. 肯定狀態

    • 最後一步: 最優策略中使用的最後一枚硬幣ak
    • 轉化成子問題:最少的硬幣拼出更小面值27-ak
  3. 肯定轉移方程:f[X] = min{f[X-2]+1,f[X-5]+1,f[X-7]+1} +1
  4. 肯定初始條件 和邊界狀況: f[0]=0;沒法拼出,F[X] = 正無窮
  5. 肯定計算順序: f[0]-->f[1]-->f[2]....
個人滴滴雲專屬AI大師碼:3388,
購買滴滴雲GPU等AI產品輸入大師碼享9折優惠。
點擊 www.didiyun.com前往滴滴雲官網購買


本篇文章由一文多發平臺ArtiPub自動發佈

相關文章
相關標籤/搜索