鉴于题解区已满,在讨论区整理一下常见的易错点及以前的好心人的Hack数据。
sample 1(原题样例,极弱)
3 4 2
9 N 5 N 1 N 8 N
5 N 5 Y 5 N 5 N
6 N 2 N 4 N 3 N
sample 2(yangwenbin,中等偏弱)
1 5 185
3985 Y 6951 N 2151 Y 1749 N 7413 Y
sample 3(sipu6174,中等强的一组)
3 3 1
0 N 5 Y 0 N
0 N 5 Y 0 N
0 N 2 N 0 N
sample 4(communist,比较强的一组)
4 4 6
9 Y 9 N 1 Y 1 Y
9 Y 3 Y 9 N 9 Y
5 N 7 N 6 N 6 N
3 Y 5 Y 6 N 7 Y
坑点:
很多人都是上来第一眼看着很像分组背包,然后就写了一个分组背包,交上去发现好像是50pts吧,我没试过
那么首先第一就要注意对于 Y 的砖虽然说打完前后子弹数不增不减,但是你能打它的前提是你有>0颗子弹
第二点就是像我,所有转移的时候都在分组背包的枚举到 Y 转移的时候只要以它结束就都限制有>0颗子弹。这也是错的,因为如果能合理选择打砖块顺序就能把要打的Y全部打掉之后不以Y结尾,从而不需要最后还剩一颗。
还有的人想到这一步就说那干脆就不限制>0了,会浪费子弹,结果又退步到第一种里去了
那么正确的做法就是把第一、二种结合一下:
我们按照没有>0限制算出所有列的前缀分组背包f1[列][子弹],同理后缀的f2[列][子弹],最后枚举最后操作的列(i),那么这一列就需要满足>0限制而1~i-1和i+1~n则不需要,那么就用f1[i-1][]+sum+f2[i+1][]更新一下答案,[]里面的东西以及sum的含义看代码吧不好解释