问题描述:有 n
个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。
请判定 第一个玩家 是输还是赢?
该题为一道典型的动态规划题,但此处将描述一种递归的极简的算法。
题目中给出的测试用例如下:
n = 1
, 返回 true
.
n = 2
, 返回 true
.
n = 3
, 返回 false
.
n = 4
, 返回 true
.
n = 5
, 返回 true
.
5
,
返回 true
,第二个玩家必赢;假设第一个玩家拿走了两个硬币,则对于第二个玩家还剩四个硬币,由于n
= 4
,
返回 true
,则第二个玩家必赢。因此n
=6时
返回 false
.依次类推,第一个玩家的输赢结果应该是周期为3的循环。所以代码如下:
public class Solution {
public boolean firstWillWin(int n) {
if (n % 3 == 0) {
return false;
}
else return true;
}
}
该方法用数学的方式解决了动态规划过程中面临的繁琐的问题。