刷题之路_1

两天来一直在弄 垃圾陷阱 这道题,

最开始竟然连dfs也不会写orz ,

非常急躁地想要去做题,

最后写出了一个结构和码风都非常差的剪枝dfs。

数据很水,让我过了7个点

然后就想着要改成记忆化搜索,

结果因为不知道怎么处理生命的限制条件而无从下手。

看到time这个维度可以删去,就删了,然后开三维数组。

但因为结果有两种情况,

返回了一种情况又想着怎么弄另一种情况,

最后这种尝试在调试怎么都不过、返回值不明确的情况下结束

然后走投无路的我去看了题解,发现这就是道背包dp题…………

但是这道题比一般的背包dp题多了很多迷惑人的地方

首先我们可以把这个弥天大坑看做一个背包,

再把扔进去的垃圾的高度看做有价值的物品,

如果只有这些的话那么这就是一个普及-的dp题了!

但是我们发现:

1.垃圾的使用受投入时间和奶牛生命的限制

2.状态除了垃圾个数以外有奶牛生命、时间、达到的高度

先试试把垃圾使用的限制条件放一边。

最优的时间一定是处理最后一个垃圾的时间,

把垃圾个数作为第一个开数组的状态,

生命和高度两者任选其一作为存储的值,剩余的作为开数组的状态。

然后尝试写状态转移方程,再把限制的条件作为转移的限制条件,又遇到了新问题:

改变的值是从当前垃圾取得还是从上一个垃圾处取得?

联系dp的一些基本概念,发现是处理当前垃圾的决策是改变状态的因素,

所以当然是当前垃圾改变状态值。

蒟蒻无比 的 我迎来了最后一个问题:

初始值的设置。

按照题解的讲解写好程序后发现状态转移变成了状态复制,

一行行不论高度全都是一样的值!?

开始怀疑是因为找生命的最大值导致当前永远是一有垃圾就吃的值

然而最后发现是因为初始值设成了在处理了0个垃圾时在任何高度上都有10的生命,

这等于忽略了高度这一限制条件,

当然开始就只能在高度0待着,只有高度0有生命10。

修改后终于过了。

于是蒟蒻花了4小时水一道实际难度为 普及+/提高 的 题。

猜你喜欢

转载自www.cnblogs.com/StarOnTheWay/p/10541669.html