LeetCode1510. 石子游戏 IV

1510. 石子游戏 IV

难度困难6

Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。

一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。

如果石子堆里没有石子了,则无法操作的玩家输掉游戏。

给你正整数 n ,且已知两个人都采取最优策略。如果 Alice 会赢得比赛,那么返回 True ,否则返回 False 。

示例一:

输入:n = 1
输出:true
解释:Alice 拿走 1 个石子并赢得胜利,因为 Bob 无法进行任何操作。

示例二:

输入:n = 2
输出:false
解释:Alice 只能拿走 1 个石子,然后 Bob 拿走最后一个石子并赢得胜利(2 -> 1 -> 0)。

分析:经典的博弈论问题,通过分析可以知道,存在先手必胜或先手必败的状态。

必胜态:可以转移到必败态的状态;

必败态:可以转移到必胜态的状态;

所以枚举每个状态,判断一下是否可以转移到必败态,可以即是必胜态,时间复杂度O(n\sqrt{n} )

代码:

class Solution {
public:
    vector f;
    bool winnerSquareGame(int n) {
        f = vector(n + 1);
        f[1] = 1;
        for (int i = 2; i <= n; i ++)
            for (int j = 1; j * j <= i; j ++) {
                if (!f[i - j * j]) {
                    f[i] = 1;
                    break;
                }
            }
        return f[n];
    }
};

 

你可能感兴趣的:(LeetCode)