目录
力扣1025. 除数博弈
题目链接:力扣1025. 除数博弈
爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。
最初,黑板上有一个数字 n 。在每个玩家的回合,玩家需要执行以下操作:
选出任一 x,满足 0 < x < n 且 n % x == 0 。
用 n - x 替换黑板上的数字 n 。
如果玩家无法执行这些操作,就会输掉游戏。
只有在爱丽丝在游戏中取得胜利时才返回 true 。假设两个玩家都以最佳状态参与游戏。
示例 1:
输入:n = 2
输出:true
解释:爱丽丝选择 1,鲍勃无法进行操作。
示例 2:
输入:n = 3
输出:false
解释:爱丽丝选择 1,鲍勃也选择 1,然后爱丽丝无法进行操作。
提示:
1 <= n <= 1000
解题思路:
对于这种问题其实n的大小就决定了先手赢还是输,所以我们可以通过找规律来解题目,或者通过动态规划来解题,但是这道题找规律是比较困难的,所以我们直接使用动态规划,首先处理n等于1的时候绝对为0,然后枚举i为2到n求dp数组的解,对于每个i我们枚举j为1到i-1进行判断是否能整除并且剩下的那个数(i - j)是否一定为输,这样就能确定当前的i一定为赢,当判断完后没找到就给0(代表输),由于我在初始化的时候全给了输,所以就省略了
class Solution {
public:
bool divisorGame(int n) {
//为了省略步骤直接全给0,并不影响后续推导(原来是打算给n为1的情况下赋值为0的)
int dp[1005] = {0};
//从2开始一直到n进行推导
for(int i = 2; i <= n; i++)
{
//每次枚举1到n-1
for(int j = 1; j <= i - 1; j++)
{
//首先判断是否能整除,然后判断替换的数是否是会输的情况
if(dp[i-j] == 0 && i % j == 0)
{
dp[i] = 1;
break;
}
//其实出了这个循环应该给0,但是我初始定义的时候给0了所以就省略了
}
}
//最后判断是0还是1
if(dp[n])return true;
else return false;
}
};