總結:git
1.何時用動態規劃?code
知足下面三個條件之一,極有多是使用動態規劃:ip
求最大值最小值;it
判斷是否可行;io
統計方案個數(而不是給出每一個具體的方案);模板
2.何時不使用動態規劃?cli
知足下面三個條件之一,極不多是使用動態規劃:方法
求出全部具體方案而非方案個數;im
輸入數據是一個集合而不是序列;(揹包問題除外)
暴力方法複雜度已是多項式級別;統計
3.動規四要素
(1)狀態
靈感,創造力,存儲小規模問題的結果
(2)方程
狀態之間的聯繫,怎麼經過小的狀態,來算大的狀態
(3)初始化
最極限的小狀態是什麼, 起點
(4)答案
最大的那個狀態是什麼,終點
4.六類動規(每種類型的狀態定義比較固定):
座標型動態規劃
序列型動態規劃
雙序列動態規劃
劃分型動態規劃
揹包型動態規劃
區間型動態規劃
5.座標型動態規劃
特色:路徑,小人走
狀態模板: f[x] 表示我從起點走到座標x……
f[x][y] 表示我從起點走到座標x,y……
lintcode例子:114,115 unique paths i and ii,
111 climbing stairs,
110 Minimun path sum,
109 Triangle,
116,117 Jump game i and ii,
76 Longest Increasing Subsequence.
6.tips
(1)貪心法不須要學,由於沒有通用性,「背誦」如下幾個經典的題目便可:
http://www.lintcode.com/en/problem/majority-number/
http://www.lintcode.com/en/problem/create-maximum-number/
http://www.lintcode.com/en/problem/jump-game-ii/
http://www.lintcode.com/en/problem/jump-game/
http://www.lintcode.com/en/problem/gas-station/
http://www.lintcode.com/en/problem/delete-digits/
http://www.lintcode.com/en/problem/linked-list-cycle-ii/
http://www.lintcode.com/en/problem/linked-list-cycle/
(2)動態規劃與分治的本質區別:子問題之間有無交集。