292. Nim 游戏
链接:https://leetcode-cn.com/problems/nim-game/
题目描述见链接内容。
是看到了一道字节跳动的面试题目:
假设有130个苹果,你我轮流拿,每次可拿1-5个,如何保证你拿到最后一个苹果;
找到了LeetCode上的对应的一道题目,先来把这个想清楚,就知道上面的题目如何解决了。
不过也得承认,我的智商确实不太够用。
解法1:动态规划
(1)第一步:定义数组元素的含义
用一个一维数组来表示当前数量下是否可以赢得游戏,true
的代表可以
(2)第二步:找出数组元素之间的关系式
dp[i] = !dp[i - 1] || !dp[i - 2] || !dp[i - 3];
当前数量下能否取胜,取决于取走1
或2
或3
后,对方能否取胜,如果对方失败,那么我就可以取胜,所以需要取反,而且只要三种情况下我能够有一种情况能够取胜,就可以,所以是或的关系
(3)第三步:找出初始值
n
等于1
或2
或3
时,是一定可以取胜的,所以初始值就是dp = [true, true, true]
所以代码可以写出来: