5.7
p1004 滑雪[2d最长下降子序列]
无思路.
p1005 采药[简单01背包], 调了1.5h
[spec,1d] f[j] = max{f[j], f[j - c[i]] + w[i]}, 能够有效避免f[i][j]中i的指代问题
*2d写法须注意f[i][j] = f[i-1][j]的值传递
for (i = 1; i <= n; i++)
for (j = T; j >= 1; j--)
if (j >= t[i])
f[i][j] = max(f[i - 1][j], f[i - 1][j - t[i]] + w[i]);
else f[i][j] = f[i - 1][j];
p1003 找啊找啊找GF[加强版01背包], 调了1h
读题分析后发现是0/1背包模型, 时间需要单独处理.(一开始认为要记录路径, 其实不用这么麻烦)
f[m][r] = max{f[m][r], f[m - rmb[i]][r - rp[i]] + 1}
t[m][r] = max{t[m][r], f[m - rmb[i]][r - rp[i]] + time[i]}, 如果f[m]..和f[m-rmb[i]]..相等,注意更新t[m][r]
[补]写rocker的时候想到一种方法,对于dp,维度往往是需要表示的量数-1,所以关于方程状态的表示可以从时间复杂度、空间复杂度、需要表示的量数综合考虑.此题中加上time的话,显然爆时间,然后从这个方向思考方程.
p1015 公路乘车[线性dp]
f[i] = max{f[i - k] + A[k]} (1 <= k <= 10)
p1011 传纸条[双线程dp + 时间降维]
注意读题, 题目中的来回等价为两次同时的单向过程
f[x1][y1][x2][y2] = max{f[x1-1][y1][x2-1][y2], f[x1-1][y1][x2][y2-1], f[x1][y1-1][x2][y2-1], f[x1][y1-1][x2-1][y2]}+A[x1][y1]+A[x2][y2]
注意每个数if and only if取一次, f[x1][y1][x2][y2] -= A[x1][y1](x1=x2&&y1=y2)
p1014 乘法游戏[区间dp]
无思路