**[Lintcode]Coins in a Line

本文介绍了一种两人轮流从右侧取走一枚或两枚硬币的游戏,并通过数学归纳法确定了先手玩家的胜败策略。给出了具体实现的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

There are n coins in a line. Two players take turns to take one or two coins from right side until there are no more coins left. The player who take the last coin wins.

Could you please decide the first play will win or lose?

Example

n = 1, return true.

n = 2, return true.

n = 3, return false.

n = 4, return true.

n = 5, return true.


数学归纳法,res[i]代表当一共有i个硬币时,先手是否能赢。当i枚硬币时,因为每次只能取1~2枚,所以当i-1和i-2均为true时,i一定为false

公式总结为:

res[i] = 0 if i <= 2

res[i] = !(res[i - 1] && res[i - 2]) otherwise


public class Solution {
    /**
     * @param n: an integer
     * @return: a boolean which equals to true if the first player will win
     */
    public boolean firstWillWin(int n) {
        boolean[] res = new boolean[n + 1];
        if(n == 0) return false;
        if(n <= 2) return true;
        res[0] = true;
        res[1] = true;
        res[2] = true;
        
        for(int i = 3; i <= n; i++) {
            res[i] = !(res[i - 1] && res[i - 2]);
        }
        return res[n];
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值