zoukankan      html  css  js  c++  java
  • 硬币排成线

    硬币排成线

    题目:
    有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。

    请判定 先手玩家 必胜还是必败?

    若必胜, 返回 true, 否则返回 false.

    样例
    样例 1:

    输入: 1
    输出: true
    样例 2:

    输入: 4
    输出: true
    解释:
    先手玩家第一轮拿走一个硬币, 此时还剩三个.
    这时无论后手玩家拿一个还是两个, 下一次先手玩家都可以把剩下的硬币拿完.

    解题思路:博弈型动态规划,首先从只剩一枚硬币开始思考,只有一枚硬币时则必胜,同理只有两枚硬币时也是必胜,而只有三枚硬币时则必败,因为无论怎么取都会剩下硬币,而且剩下的数目下一轮就可以全拿完。当只有n枚硬币时,如果只剩n - 1或者 n - 2的情况下有必胜(也就意味着对手必胜)那么说明只剩n枚硬币时必败,只有当n - 1或者 n - 2的情况都是必败则只剩n枚硬币时必胜

    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) {
            if(n == 0)
                return false; 
            //数组定义:dp[i]表示只剩i枚硬币时必胜/必败
            boolean[] dp = new boolean[n + 1];
            // false必败,true必胜
            dp[0] = false;
            dp[1] = true;
            
            for(int i = 2; i <= n; i++) {
                dp[i] = !(dp[i - 1] && dp[i - 2]);
            }
            
            return dp[n];
        }
    }
    
  • 相关阅读:
    MySQL 多会话之间更新数据的小实例
    MySQL Profile
    MySQL Explain
    MySQL 索引
    利用网站上传漏洞使用一句话木马控制服务器
    kali之nmap
    kali之使用sqlmap进行sql注入
    kali之DVWA
    Kali安装nessus
    openvas
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/14036089.html
Copyright © 2011-2022 走看看