• 组合博弈


    1.LA 5760 Alice and Bob

    题意:有$n$堆($n leq 50$)石子,有两种合法操作:从任意堆中挑选一个石子并移走或合并任意两堆石子。无法进行操作的输。问双方均使用最优策略,先手赢还是输。每堆石子的个数不超过$1000$。

    分析:如果我们把所有石子堆的石子数作为一个集合当作状态,此题是没法解的,因为状态的复杂度太高。所以只能继续挖掘信息,注意到如果所有石子堆的石子数都大于$1$,那么先手必胜当且仅当取完所有石子的最大操作步数(石子总数$-$石子堆数$+1$)为奇数,不难看出必胜者只需在堆数大于$1$时不断进行有效的合并操作即可维持其必胜状态。现在考虑在之前的石子堆中添加若干只有$1$个石子的石子堆,首先给出结论:用石子数只有$1$的堆的个数与其余堆石子的最大操作步数作为二元组作为状态对于确定当前局面必败还是必胜是充分的。不妨设当前状态为$S=(x, y)$,这种表示总是合理的除非遇到如下情形:在某次局面中有一个石子数为$2$的堆,先手取走一个那么得到石子数为$1$的堆,此时我们还是把它算进$y$里的,尽管它实际上只有一个石子,这样做是合理的当且仅当我们知道后手不会将剩余的唯一一个石子直接移走或者先手不会去移走石子数为$2$的堆的石子。设前面一个状态为$A$,后一个状态为$B$,如果$A$是必胜态,那么先手一定不会移走$2$-堆中的石子,否则后手可以通过将$1-$堆中的石子移走实现“一次移动等价两次操作”(省去一次合并),从而扭转其局势,那么先手就输了;如果$A$是必败态,那么后手一定不会移走$1-$堆中的石子,道理类似。实际上影响当前局面的是$y$的奇偶性而不是其具体值。但是这样表示状态已经足够解出本题了,可以用动态规划计算出当前状态必败还是必胜。

  • 相关阅读:
    中国象棋评估函数建模
    C语言中指针变量传参
    STM32外部中断
    C语言中的注释
    STM32学习网址
    C语言中的布尔值
    更改KEIL背景配色
    Modbus通讯协议
    DUP
    算法的时间复杂度
  • 原文地址:https://www.cnblogs.com/astoninfer/p/5752198.html
Copyright © 2020-2023  润新知