首页 > 技术文章 > Day5

backkom-buaa 2019-09-07 22:03 原文

DP为什么这么难受啊....

luogu p1156

题意

​ 小明掉井里了,这个井深为D,由于体能消耗,小明只能坚持10小时就要见上帝,幸运的是每隔一段时间有人给小明投垃圾,吃垃圾续命,不吃垃圾可以用来垫脚减少与井口的距离。问给出D和一段垃圾序列,以及对应的续命时间和垫脚高度,问小明能否或者出来,能则输出最小时间,否则输出最大苟命时间

思路

​ 相关元素有时间、生命、高度、垃圾,由于每个垃圾可吃可不吃,故而dp的第一个维度给垃圾表示决策的阶段,

然后关于时间、生命、高度,由于垃圾本身代表了时间,所以可以不用再考虑,现在只剩下生命与高度两个维度。经过分析(不想写了,其实是生命的上限并不确定,但是高度的上限是确定的,方便DP),选择了第二个维度为高度,然后dp值表示最大生命。

​ 然后这里存在两种思路,填表法,即根据上一个状态+当前决策来决定当前状态,即d[i]是由d[i-1]+对于i的决策来影响。或者是刷表法,d[i] + 对于i+1的决策来影响d[i+1]

​ 填表法:

​ 状态转移很好写,在dp的时候判断,如果填表更新了井口,也就意味着存在决策有解,那么直接break输出。否则,退出循环输出dp[n][0]。注意状态转移的条件和初始化

​ 刷表法:

​ 状态转移的考虑为:d[i+1] 的更新是由d[i]来完成的,注意前提,如果井口刷新则break,

​ 否则输出d[i][0]。

今天又是糟糕的一天呐。

推荐阅读