两天来一直在弄 垃圾陷阱 这道题,
最开始竟然连dfs也不会写orz ,
非常急躁地想要去做题,
最后写出了一个结构和码风都非常差的剪枝dfs。
数据很水,让我过了7个点
然后就想着要改成记忆化搜索,
结果因为不知道怎么处理生命的限制条件而无从下手。
看到time这个维度可以删去,就删了,然后开三维数组。
但因为结果有两种情况,
返回了一种情况又想着怎么弄另一种情况,
最后这种尝试在调试怎么都不过、返回值不明确的情况下结束
然后走投无路的我去看了题解,发现这就是道背包dp题…………
但是这道题比一般的背包dp题多了很多迷惑人的地方
首先我们可以把这个弥天大坑看做一个背包,
再把扔进去的垃圾的高度看做有价值的物品,
如果只有这些的话那么这就是一个普及-的dp题了!
但是我们发现:
1.垃圾的使用受投入时间和奶牛生命的限制
2.状态除了垃圾个数以外有奶牛生命、时间、达到的高度
先试试把垃圾使用的限制条件放一边。
最优的时间一定是处理最后一个垃圾的时间,
把垃圾个数作为第一个开数组的状态,
生命和高度两者任选其一作为存储的值,剩余的作为开数组的状态。
然后尝试写状态转移方程,再把限制的条件作为转移的限制条件,又遇到了新问题:
改变的值是从当前垃圾取得还是从上一个垃圾处取得?
联系dp的一些基本概念,发现是处理当前垃圾的决策是改变状态的因素,
所以当然是当前垃圾改变状态值。
迎来了最后一个问题:
初始值的设置。
按照题解的讲解写好程序后发现状态转移变成了状态复制,
一行行不论高度全都是一样的值!?
开始怀疑是因为找生命的最大值导致当前永远是一有垃圾就吃的值
然而最后发现是因为初始值设成了在处理了0个垃圾时在任何高度上都有10的生命,
这等于忽略了高度这一限制条件,
当然开始就只能在高度0待着,只有高度0有生命10。
修改后终于过了。
于是花了4小时水一道实际难度为 普及+/提高 的 题。