例题一 数字三角形POJ1163
1.第i行第j个:
MAX(i, j) = max(MAX(i + 1, j), MAX(i + 1, j + 1))+ map[i][j]
2.第k个:
MAX[k] = max(MAX[k],MAX[k + 1])+ map[i][j]
初始状态为最底层数字
例题二 最长上升子序列 百练2757
以第i, j个数字为终点,初始状态MAX[1]= 1
if(a[i] > a[j])
MAX[i]= max(MAX[i],MAX[j] + 1)
例题三 公共子序列 POJ 1458
第一序列第i个,第二序列第j个
if(len1[i] == len2[j])
MAX(i, j) = MAX(i - 1, j - 1) + 1
else
MAX(i, j) = max(MAX(i - 1, j),MAX(i,j - 1))
初始状态:MAX(0, N)= MAX(N, 0) = 0
例题四 最佳加法表达式
设V(m,n)表示在n个数字中插入m个加号所能形成的表达式最小值,那么:
if(m = 0)
V(m,n) = n个数字构成的整数
else if
n < m + 1
V(m, n) = INF
else
V(m, n) = min{V(m- 1, i) + Num(i + 1, n)}(i = m...n - 1)
Num(i,j)表示从第i个数字到第j个数字所组成的数。数字编号从1开始算。
例题五 help Jimmy POJ 1661
首先将板子按高度排序,
初始条件,左右两端下面没有板子且高度小于MAX的板子距地高度
MIN(k) = min(MIN(k左端) ,MIN(右端))
例题六 神奇的口袋 百练 2755
1.从前n种物品中挑选物品,V为剩余体积, 初始条件为pick(,0)= 1
pick(n, V)= pick(n – 1, V – v[k])+ pick(n -1, V)
2.初始条件为:pick[0][] =1
for( V = 1; V <= 40; V++)
for(n= 1; n <= N; n++)
{
pick[V][n]= pick[V][n - 1]
if(V– v[n] >= 0)
pick[V][n]+= pick[V – v[n]][n - 1]
}
例题七 0-1背包 POJ 3624
从前n种物品中挑选物品,V为剩余体积
初始条件为pick[1][V] = value[1] (v[1] <=V) , pick[1][V] = 0 (v[1] > V)
pick[n][V] = max(pick[n- 1][V], pick[n - 1][V – v[n]] + value[n])
记忆化递归优化
例题八 滑雪 百练1088
从点(m, n)开始滑,初始条件,若周围没有点可以滑下,dp[m][n] = 1
否则:dp[m][n] = max(dp[m - 1][n], dp[m + 1][n],dp[m][n - 1] ,dp[m][n + 1]) + 1
例题九 分蛋糕
设ways(w, h, m)表示宽为w、高为h的蛋糕,被切m刀后,最大的那块蛋糕的面积最小值题目就是要求ways(W, H, M - 1)
边界条件: w * h < m + 1 ==》 INF ,m == 0 ==》 w * h
SV为第一刀竖着切时能得到的最好结果,SH为第一刀横着切时能得到的最好结果
ways(w, h, m) = min(SV, SH)
SV = min{Si, i = 1…w - 1}
其中 Si=为第一刀左边宽为i的情况下的最好结果。
Si=min{max(ways(i, h, k), ways(w - i, h, m –1 - k)), k = 0…m - 1}