1510.石子游戏 IV
力扣题目链接:https://leetcode.cn/problems/stone-game-iv/
题目:
Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。
一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。
如果石子堆里没有石子了,则无法操作的玩家输掉游戏。
给你正整数 n ,且已知两个人都采取最优策略。如果 Alice 会赢得比赛,那么返回 True ,否则返回 False 。
示例 1:
输入:n = 1
输出:true
解释:Alice 拿走 1 个石子并赢得胜利,因为 Bob 无法进行任何操作。
示例 2:
输入:n = 2
输出:false
解释:Alice 只能拿走 1 个石子,然后 Bob 拿走最后一个石子并赢得胜利(2 -> 1 -> 0)。
示例 3:
输入:n = 4
输出:true
解释:n 已经是一个平方数,Alice 可以一次全拿掉 4 个石子并赢得胜利(4 -> 0)。
思路:
首先,当石子n(n可以为0)为Alice必输的情况下,那n+i*i
(其中i为正整数)个石子时Alice必胜。
因此,逆向思维,当有n个石子时,从前面n-i*i
(i为正整数)最优解集合中存在必输的结果时,Alice获胜。
java代码
class Solution {
public boolean winnerSquareGame(int n) {
//记录最优解
boolean[] state = new boolean[n+1];
//遍历找到每种石子i的最优解
for(int i = 1;i <= n;i++){
//每次取j的平方个石子
for(int j = 1;j * j <= i;j++){
//如果存在必输的情况,则当石子为i的情况下Alice必胜,并跳出循环
if(state[i - j * j] == false){
state[i]=true;
break;
}
}
}
return state[n];
}
}