警钟敲碎 + 对贪心删数的 hack
  • 板块CF2043F Nim
  • 楼主__vector__
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/27 17:36
  • 上次更新2024/12/27 21:13:31
查看原帖
警钟敲碎 + 对贪心删数的 hack
507348
__vector__楼主2024/12/27 17:36

如果你 wa 了,并且是这个做法:

若同一大小的堆 >2\gt 2 个,那么将这种大小的堆删除 22 个,反复对每个堆执行此操作。
在操作结束之后的结果中进行 dp。

  • 这个方法求方案数会求措。
  1. 你的做法是先尽可能多的两个两个的删同一种类,在剩余的物品里面 dp,此时两个两个删同一种类的方案数没有被考虑。
  2. 接下来,如果你计算了两个两个删同一种类的方案数,但是算出来的方案数大于标准答案,举个简单的例子,有 10 件同一类型的物品,最优解中全部都删掉了,那么标准答案是 11 种方案,但是你计算的方案数为 10×92×1=45\frac{10\times 9}{2} \times 1 = 45,即两个两个删的方案数乘 dp 方案数。
  3. 接下来,如果你将 dp 方式进行了修改,每 dp 到一种类型的时候,直接根据这种类型剩余多少个进行计算(当然,贪心方式仍然是先两个两个删到 2\le 2 个的状态),那么你会发现方案数还是错了。
  • 这种 dp 状态实际上不能求出所有解
    Hack.in
4 1
3 3 2 3
1 4

Hack.out

2 3

按照上述 dp 状态会输出 1-1
事实上保留 3,33,3 是最优解。
但是提前删除了两个 33,剩下的两个数不能形成任意一组合法的解。
考虑 dp 过程中枚举当前种类保留几个数(肯定少于 22),就能完美解决这个问题。

2024/12/27 17:36
加载中...