#dp #线性dp #经验总结
简化版题目: 给定路径长度 ,初始位置为 ,可以选择静止或向前移动若干单位,移动范围在 到 之间。最多可以移动 次。路径上每个位置有若干数量的物品。求最多可以收集到的物品数量。
第一行包含一个整数 (),表示测试用例的数量。
对于每个测试用例:
看起来写 dp 是愉快的选择~
因为子问题重叠,所以可以写个记忆化搜索。感觉答案空间还是比较好搜的(容易遍历),估计搜索函数部分 20 行以内可以解决。
显然这个题目只需要写几个循环就行了,那不会超过 10 行。
最优状态很显然是可以收集到的物品的最大值。
我们先筛一下哪些状态对我们有用:到达某个点 时,使用过 次跳跃,此点的获得值应该为 跳跃时的值加上此点的值。
那么很显然,这一切都与目前的位置 / 目前使用过跳跃的次数 有关系,那就可以顺理成章的打出 表示目前位置的状态。
转移方程可以先口胡一下再验证:
可以发现,这个题好像已经做完了(逃)
然后看到 ,就要注意一下越界的问题。最开始我写了这么样的代码:
cppint p=max(0, i-o);
试图给 的部分进行转移,这显然是没有办法解释的操作(人类迷惑行为),实际上只需要不处理这部分即可:
cppif(i-o<0) continue;
感觉这个题目主要难度还是在设计状态上面,太久不做 dp 题,根本没这种感觉 XD。
本文作者:CornWorld
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!