题目

https://leetcode-cn.com/problems/nim-game/

题解

本题实际上是一个需要分析的数学题。如果第一时间没有发现规律的话,可以尝试先用递归法,暴力输出前几个,观察规律。

// 用本函数跑 1~100,找规律
public boolean canWin(int n) {if (n <= 3) return true;// canWinNim(n-1), canWinNim(n-2), canWinNim(n-3) 只要有一个为false本轮就能赢// 也就是说,除非都为true才返回false,否则本轮能赢返回truereturn !(canWin(n - 1) && canWin(n - 2) && canWin(n - 3));
}

输出结果如下。

i=1, canwin=true
i=2, canwin=true
i=3, canwin=true
i=4, canwin=false
i=5, canwin=true
i=6, canwin=true
i=7, canwin=true
i=8, canwin=false
i=9, canwin=true
i=10, canwin=true
i=11, canwin=true
i=12, canwin=false
i=13, canwin=true
i=14, canwin=true
i=15, canwin=true
i=16, canwin=false
i=17, canwin=true
i=18, canwin=true
i=19, canwin=true
i=20, canwin=false

这样,规律就显而易见了,即:每逢 4 的倍数返回 false,其余都返回 true。

为什么会出现这样的规律呢?实际上,是可以通过推理得到的:

面对4的整数倍的人,永远无法翻身,你拿N根对手就会拿4-N根,保证每回合共减4根,你永远对面4倍数,直到4。相反,如果最开始不是4倍数,你可以拿掉刚好剩下4倍数根,让他永远对面4倍数。

发现这个规律之后,本题就很简单了。代码如下:

class Solution {public boolean canWinNim(int n) {return n % 4 != 0;}
}


2021-11-16 二刷

题目

https://leetcode.com/problems/nim-game/

题解

DP空间超了,DP+空间优化时间超了,只能数学解法。。

class Solution {public boolean canWinNim(int n) {// Approach 1: Recursive, Brute Force
//        return process(n);// Approach 2: DP
//        if (n <= 3) return true;
//        boolean[] dp = new boolean[n + 1];
//        dp[0] = false;
//        dp[1] = true;
//        dp[2] = true;
//        dp[3] = true;
//        for (int i = 4; i <= n; i++) {//            dp[i] = !dp[i - 1] || !dp[i - 2] || !dp[i - 3];
//        }
//        return dp[n];// Approach 3: DP + Space optimization
//        if (n <= 3) return true;
//        boolean[] dp = new boolean[4];
//        dp[0] = false;
//        dp[1] = true;
//        dp[2] = true;
//        dp[3] = true;
//        int i = 3;
//        while (i++ <= n) {//            dp[i % 4] = !dp[(i + 4 - 1) % 4] || !dp[(i + 4 - 2) % 4] || !dp[(i + 4 - 3) % 4];
//        }
//        return dp[n % 4];// Approach 4: 玄学// 对dp数组[false, true, true, ture]进行滚动更新,当除了自己以外其他3个均为true时结果为false,否则结果为true// 所以,滚动更新了个寂寞,根本不需要更新return n % 4 != 0;}// 还剩n个石子的情况下,当前玩家以先手姿态是否能赢
//    public boolean process(int n) {//        if (n <= 0) return false;
//        else if (n <= 3) return true;
//        // 只要有一种方法让对方不能赢,那么我就能赢
//        return !process(n - 1) || !process(n - 2) || !process(n - 3);
//    }
}

leetcode 292. Nim Game | 292. Nim 游戏(DP->数学推理)相关推荐

  1. Nim问题和阶梯Nim(staircase nim)

    Nim问题和阶梯Nim(staircase nim) Nim问题: 有若干堆石子,每堆石子的数量都是有限的,合法的移动是"选择一堆石子并拿走若干颗(不能不拿)",如果轮到某个人时所 ...

  2. LeetCode:完全平方数【279】【DP】

    LeetCode:完全平方数[279][DP] 题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示 ...

  3. NC17134 Symmetric Matrix(dp+数学)

    链接:https://ac.nowcoder.com/acm/problem/17134 solution 首先看一下 n×nn \times nn×n 的方阵需要满足的条件: 矩阵中的任意元素 ai ...

  4. 计算机教育游戏,小学数学计算机教育游戏应用

    教育界流传着这样一句话:学生的学习兴趣是提升学生成绩的关键.可以说,学生如果能够饱含热情地面对学习,将学习知识扭转为兴趣学习,那么必然可以大幅提高学生的主动学习能力,进而提高学生的学习成绩.由于数学是 ...

  5. leetcode刷题:292. Nim 游戏(Java)

    题目描述 你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函 ...

  6. LeetCode 292 Nim Game(Nim游戏)

    翻译 你正在和你的朋友们玩下面这个Nim游戏:桌子上有一堆石头,每次你从中去掉1-3个.谁消除掉最后一个石头即为赢家.你在取出石头的第一轮.你们中的每一个人都有着聪明的头脑和绝佳的策略.写一个函数来确 ...

  7. 292. Nim Game(尼姆游戏)

    题目 You are playing the following Nim Game with your friend: There is a heap of stones on the table, ...

  8. #1163 : 博弈游戏·Nim游戏(数学博弈)

    #1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样 ...

  9. leetcode 55. Jump Game | 55. 跳跃游戏(暴力递归->傻缓存->DP)

    题目 https://leetcode.com/problems/jump-game/ 题解 又是经典套路,暴力递归->傻缓存->DP 没写草稿,直接看代码吧 class Solution ...

最新文章

  1. 《课程的反思与重建--我们需要什么样的课程观》 心得体会
  2. php中的extract函数
  3. php 屏蔽mysql错误提示_PHP.ini中配置屏蔽错误信息显示和保存错误日志
  4. mysql rename所标时间_mysql rename命令
  5. 集成电路史上著名的十个人,有几个中国人?
  6. js_long.php,protobuf.js 与 Long.js的使用详解
  7. 容器编排技术 -- Init 容器
  8. Java基础-TreeSet与Java自定义类型的排序
  9. 2020年11月“省时查报告”十大热门报告盘点(文末附热门报告列表)
  10. pwm一个时间单位_通过PWM进行数模转换的滤波电路分析计算
  11. 从数据仓库到大数据平台再到数据中台(内附13张架构图)
  12. html用360打不开,win7系统使用360安全卫士解决浏览器打不开的方法
  13. 名悦集团国庆出行自驾游攻略
  14. 浏览器输入网址后发生了什么?
  15. 关于uniapp获取ios客户端平台安全距离(底部导航条)的方法
  16. 使用 NoSQL 数据库提供云级别数据可伸缩性
  17. 深度式睡眠潜入虚拟世界_潜入swiftui的惊人世界
  18. 游戏开发中的物理介绍
  19. 美国海军战列舰——衣阿华(IOWA)级密苏里号
  20. 双引号等在双引号中使用时候的方法

热门文章

  1. 牛客 - 奇怪的背包问题增加了(贪心)
  2. 多边形三角剖分问题的综述
  3. 服务器发送消息技术,知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)...
  4. POJ1785(笛卡尔树的构造)
  5. HDU4273(求三维凸包重心到表面的最短距离)
  6. 任意模数NTT(MTT)
  7. 《openssl编程》之openssl简介
  8. 1_5 PrototypeMode 原型(克隆)模式
  9. 2_6 CompositeMode.cpp 组合模式
  10. []int 能转换为 []interface 吗?