算法题每日一练---第75天:Nim 游戏

简介: 你和你的朋友,两个人一起玩 Nim 游戏。

3.png

一、问题描述


你和你的朋友,两个人一起玩 Nim 游戏

  • 桌子上有一堆石头。
  • 你们轮流进行自己的回合, 你作为先手
  • 每一回合,轮到的人拿掉 1 - 3 块石头。
  • 拿掉最后一块石头的人就是获胜者。


假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false


题目链接:Nim 游戏


二、题目要求


样例

输入: n = 4
输出: false 
解释: 以下是可能的结果:
1. 移除1颗石头。你的朋友移走了3块石头,包括最后一块。你的朋友赢了。
2. 移除2个石子。你的朋友移走2块石头,包括最后一块。你的朋友赢了。
3.你移走3颗石子。你的朋友移走了最后一块石头。你的朋友赢了。
在所有结果中,你的朋友是赢家。


考察

数学思想、博弈论
建议用时15~35min


三、问题分析

一开始想要递归的,但可能超时,我就转向动态规划了。

true
true
true
false  
true
true
true
false  
true
true

前三个状态是定义好的,从第四个开始可选的状态有-1、-2、-3三种,我们只需要取反这三种状态的结果就行了。

class Solution {
public:
    bool canWinNim(int n) {
        int i,dp[n+1];//动态规划
        if(n<4)//前三个初始
            return true;
        dp[1]=dp[2]=dp[3]=1;//变量初始
        for(i=4;i<=n;i++)//循环判断
        {
            if(!dp[i-1]||!dp[i-2]||!dp[i-3])//关系归纳
                dp[i]=1;
            else
                dp[i]=0;
        }
        return dp[n]==1;//输出结果
    }
};

4.png

数据过大,超时了

总结的规律如下:

true
true
true
false  X
true
true
true
false  X
true
true
true
false  X
true
true
true
false  X
true
true
true
false  X

只要是4的倍数,输出false,其余输出true。

心路历程:递归过深→dp超时→总结规律。


四、编码实现


class Solution {
public:
    bool canWinNim(int n) {
        if(n%4==0)//规律
            return false;
        else
            return true;
    }
};

五、测试结果5.png

相关文章
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
948 0
|
算法
算法题每日一练---第78天:二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target
354 1
算法题每日一练---第78天:二分查找
|
存储 算法
|
算法
算法题每日一练---第76天:丑数 l
丑数 就是只包含质因数 2、3 和 5 的正整数。
304 1
算法题每日一练---第76天:丑数 l
|
算法
算法题每日一练---第74天:快乐数
编写一个算法来判断一个数 n 是不是快乐数。
332 0
算法题每日一练---第74天:快乐数
|
存储 算法
算法题每日一练---第73天:加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
361 0
算法题每日一练---第73天:加一
|
算法
算法题每日一练---第72天:数字 1 的个数
给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
456 0
算法题每日一练---第72天:数字 1 的个数
|
存储 算法
算法题每日一练---第71天:回文数
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
333 0
算法题每日一练---第71天:回文数
|
存储 算法
算法题每日一练---第68天:有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
242 0
算法题每日一练---第68天:有效的括号

热门文章

最新文章