POJ 2484(对称博弈)

题目链接:http://poj.org/problem?id=2484

这道题目大意是这样的,有n个硬币围成一圈,两个人轮流开始取硬币(假设他们编号从1到n),可以选择取一枚或者取相邻的两枚(相邻是指他们的编号相邻)。在双方都采取最优策略取硬币的情况下,问谁最后会赢。

这道题目我一开始没有什么好的办法,n从1试到7,大致能发现n>=3的时候是Bob赢,否则是Alice赢。

可是为什么这样写正确呢?有没有严格一些的证明呢?

我查阅了许多资料,有了下边的理解,可能不是很准确,望纠正。

n<=3的时候显然易得。

当n>3时,我们分成两种情况讨论。

当n为偶数。我们可以把硬币环断开平均分成两列。

    先手先取,先手无论取一个还是两个硬币(此时无所谓最优了,或者说都是最优),对方的最优策略总是跟着先手去相同数量的硬币,这样保证最后一个硬币是被后手拿掉。后手赢。

当n为奇数,如果先手取一个硬币,那么后手为了赢,他必须要想办法转化成n为偶数的情况,所以他取两个硬币;

      如果先手取两个硬币,那么后手为了赢,他必须要想办法转化成n为偶数的情况,所以他取一个硬币;

               往后的过程就与上边分析的偶数情况一致了。

综上分析,得到我们的正确答案;

1 if(n>=3) printf("Bob");
2 else printf("Alice");
原文地址:https://www.cnblogs.com/Wade-/p/6618501.html