P1156 垃圾陷阱
这道题要求了两个量,第一个是在能够爬出时爬出的最早时间,另一个是不能爬出时的最长存活时间。
首先来思考第一问,如果能够求出能够爬出的最早时间。在这道题中我们似乎能够找到的是两个费用,即生存时间和高度,由于这两个量的范围并不是很大,那么可以试试简单的将这两个量作为dp数组的两个维度。
这时候会出现一个问题,我们是应该将第一个时间的意义作为“在所有时刻中能够存活的时间”还是“能够存活的最长时刻”,假如你以能够存活的所有时间作为维度就会陷入很困难的境地,并且题目给出了每个垃圾出现的时刻,那么我们不如就将“能够存活的最长时刻”作为第一个维度。
那么这个dp数组存放的属性是什么?此题中我们仅仅需要求出是否能够爬出以及爬出的最早时间,并不需要维护其他的量,那么我们可以直接进行可行性dp。
另外还有转移方程,在这题中就是对每一个垃圾进行选择增加生存时间和增加高度的决策,那么就直接在dp[i][j]
为真的情况下让dp[i + f[i]][j]
,dp[i][j + h[i]]
为真就可以了。
那么这时候我们也能够自然而然的思考出第二问,即能够存活的最长时间就是我们一直对垃圾进行增加能量的操作,而不去增长高度,那么就可以遍历时间取出 dp[maxtime][0]
。