此题坑点太多,整理一下希望对大家有帮助。
以下来自我自己 debug 以及在讨论里看到的(部分移植自洛谷讨论)。
- 先做完全背包再做01背包,即先上升再下降。
原因:小鸟不可能在同一个位置 x 既上升又下降。
- 请不要在做完全背包时倒序枚举。
原因:你做的是个完全背包,要正序(具体原因见背包九讲)。
- 不要在一个循环里同时做完全背包和01背包。
原因:在上升的时候我们强制计算了一些无意义的状态,
可能导致一个原本无意义的状态在下降时被用来转移,导致错误。
- 在完全背包过程中,先假设所有位置都可到达,对于碰到管道的,也要先计算。
即枚举的高度时不能从 l[i]+1→h[i]−1,而应该从0→m。
原因:有可能出现上升一次碰到管道下部,但上升两次就落到管道间隙的情况。
若不假设上升一次的状态合法,上升两次状态转移时就会错误。
- 情况分为两种:
· 对于有处理溢出的(如: up=min(j+a[i],m)
):
请注意 m 可从 (m−a[i])→(m−1) 转移而来 。
· 对于没处理溢出的:
请把数组大小至少开成 m+max(a[i]) 。