除数博弈

描述:

爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。

最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:

选出任一 x,满足 0 < x < N 且 N % x == 0 。
用 N - x 替换黑板上的数字 N 。
如果玩家无法执行这些操作,就会输掉游戏。

只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。

示例 1:

输入:2
输出:true
解释:爱丽丝选择 1,鲍勃无法进行操作。

示例 2:

输入:3
输出:false
解释:爱丽丝选择 1,鲍勃也选择 1,然后爱丽丝无法进行操作。

提示:

1 <= N <= 1000

思路:

这道题有两种方法可以解,一种是数学归纳法,一种是动态规划法,这里主要讲动态规划。

数学归纳:

最终结果应该是占到 2 的赢,占到 1 的输;

若当前为奇数,奇数的约数只能是奇数或者 1,因此下一个一定是偶数;

若当前为偶数, 偶数的约数可以是奇数可以是偶数也可以是 1,因此直接减 1,则下一个是奇数;

因此,奇则输,偶则赢。

动态规划:

将所有的小于等于 N 的解都找出来,基于前面的,递推后面的。

状态转移: 如果 i 的约数里面有存在为 False 的(即输掉的情况),则当前 i 应为 True;如果没有,则为 False

java:

class Solution {
    public boolean divisorGame(int N) {
        if (N <= 1) {
            return false;
        }
        if (N == 2) {
            return true;
        }
        boolean[] tag = new boolean[N + 1];
        tag[1] = true;
        tag[2] = false;

        for (int i = 3; i < tag.length; i++) {
            tag[i] = false;
            // 约数范围,超过i/2的时候,i不存在约数
            for (int j = 1; j < i / 2; j++) {
                if (i % j == 0 && tag[i - j] == false) {
                    tag[i] = true;
                    break;
                }
            }
        }
        return tag[N];
    }
}

结果:

python3:

class Solution:
    def divisorGame(self, N: int) -> bool:
        if N == 1:
            return False
        if N == 2:
            return True
        tag = [False for i in range(0, N + 1)]
        tag[2] = True
        for i in range(3, N + 1):
            for j in range(1, i // 2):
                if i % 2 == 0 and tag[i - j] == False:
                    tag[i] = True
                    break
        return tag[N]

结果:

原文地址:https://www.cnblogs.com/nedulee/p/11992656.html

时间: 2024-10-12 01:33:13

除数博弈的相关文章

[1] LeetCode 1025.除数博弈

做的LeetCode第一题....疯狂错误编译, 原来true or false 是给你return的, 函数已经写好了..... 完整题目 题目大意: A B 两人玩游戏 , 轮流进行, A 先手, A 胜利则输出 true, A失败输出 false 游戏内容: 给一个数字n, 你可以进行一次操作,  将 n 变为 n-x, n的要求: x必须满足 n % x == 0(n可以被x整除) 并且  0 < x < n 分析: 1:  false   A先手 没有数字被1整除还小于1的 所以A不

[Swift]LeetCode1025. 除数博弈 | Divisor Game

Alice and Bob take turns playing a game, with Alice starting first. Initially, there is a number N on the chalkboard.  On each player's turn, that player makes a move consisting of: Choosing any x with 0 < x < N and N % x == 0. Replacing the number 

leetcode 1025. 除数博弈(Divisor Game)

目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < N 且 N % x == 0 . 用 N - x 替换黑板上的数字 N . 如果玩家无法执行这些操作,就会输掉游戏. 只有在爱丽丝在游戏中取得胜利时才返回 true,否则返回 false.假设两个玩家都以最佳状态参与游戏. 示例 1: 输入:2 输出:true 解释:爱丽

Leetcode之动态规划(DP)专题-1025. 除数博弈(Divisor Game)

爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < N 且 N % x == 0 . 用 N - x 替换黑板上的数字 N . 如果玩家无法执行这些操作,就会输掉游戏. 只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false.假设两个玩家都以最佳状态参与游戏. 示例 1: 输入:2 输出:true 解释:爱丽丝选择 1,鲍勃无法进行操作. 示例 2: 输入:3 输出:f

LeetCode 5024 除数博弈 --(简单博弈论)

今天在LeetCode的看到一到题目 这道题目有点坑,没有思路的话容易钻牛角. 刚刚开始时,我想的是直接用while循环来模拟计算,后来觉得这么好麻烦,也有复制的逻辑在里面.后面我推导了一下 以下是我的推导过程,爱丽丝简称 A 鲍勃 简称B 当num=2时,A=1-->num=num-1=1,A赢 当num=3时,A只能出1,-->num=num-1=2,此时B正好处于num=2的情况,所以B可以用之前A的策略,B赢 当num=4时,A可以出1 或 2,但是为了赢,A必须让B处于输的情况,也就

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

苹果不再“雁过拔毛”的背后:利益博弈下谁是赢家?

自从库克成为苹果大当家后,苹果似乎就一直奔着利润一股脑地扎进去了.iPhone万年不变样,就连有所改变的iPhone X在售价上也是"穷凶极恶",吃相极其难看.而在今年4月份腾讯微信官方发布通告,更是将苹果推上风口浪尖.微信官方表示,由于受苹果公司新规定影响,iOS 平台的微信客户端关闭公众号打赏功能. 至于微博问答.知乎问答.今日头条及众多直播平台等在内,都逃不过苹果的"雁过拔毛"--苹果认为应用上的打赏属于"内购"行为,去抽取30%的分成.但

计算机中如何实现除数是2的幂次的除法【转载自CSDN】

前言: 本来是在看汇编里面的数据条件传送指令,做习题的时候看着这么一道有关于2的幂次方除法的题目.结果傻眼了,又尼玛不会了.........第二章看的时候就稀里糊涂的,看了几遍也没看太懂,这回又涉及到了 ,发现再回来看还是容易一点.所以写此博文,方便日后复习. 我今天遇到的问题如下: 问题: 除法,在我们平时的算数运算中,结果总是向0的方向舍入的,但是在计算机中,舍入的方式有所不同.在大多数的机器中,除法要比乘法还有加法这些运算都要慢很多倍,计算机中对于2的幂次这种数很是敏感,因为计算机当中用到

HDU1760 A New Tetris Game【DFS】【博弈】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1760 题目大意: 给你一个N*M的矩阵棋盘.数字0代表该位置可用,数字1代表该位置不可以.Lele和姐姐在这个 棋盘上下棋,每次在棋盘上放一个大小为2*2的正方形,棋子间不能相互叠加.两个人轮流放,每 次都按最优策略放正方形.轮到谁没有地方放置棋子了,就算谁输.若每次都是Lele先放,那么问 题来了:Lele是否一定能赢姐姐呢. 思路: 博弈中的必胜态:当前所能到达的状态能到达一个必败态,则当前状