震驚!動態規劃精華總結-----看完這一篇就夠了(含leetcode練習題)

Junyu08發表於2019-07-17

最近在學CS577 algorithm,做了很多DP問題,總結一下

http://pages.cs.wisc.edu/~shuchi/courses/577-S18/
我們常見的動態規劃分為三種

  1. 層級DP(最為簡單,逐層計算就好)
  2. 用二維陣列進行DP
  3. 用一維陣列進行DP

這裡先不討論樹狀DP

1. 層級DP(這裡不討論,相信絕大多數人看一眼就找到結果)

2. 二維DP

這裡先記住我一句話:二維DP首先要找兩個逐漸改變的量。(後面我們逐題分析改變的量怎麼找,找了有什麼用)

trick1: 下標可以從1開始,給下標為0的entry提前賦值好
trick2: 建立DP array可以用Integer型別,用null判斷memory

我想講兩種思路,自上而下自下而上。這又涉及到兩種思想,可以為以下對應方式
自上而下:Recursion
自下而上: 填格子

2.1 Leetcode322 coin change

這題有兩個變數。用1…n的硬幣找0…amount的錢數,因此我們的二維dp應該有硬幣下標和總錢數。

OPT(amount, index) = Math.min(OPT(amount, index-1) + (amount-coin[index-1], index))

2.2 416. Partition Equal Subset Sum

這題可以理解成是否存在一個子集能把揹包的一半裝滿

這題有兩個變數。用a[0…n]的元素裝滿還剩sum的包

OPT(n, sum) = OPT(n-1, sum) || OPT(n, sum-a[n])

相關文章