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]。
今天又是糟糕的一天呐。