力扣算法题——1510.石子游戏 IV(动态规划)

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];
    }
}

猜你喜欢

转载自blog.csdn.net/hutc_Alan/article/details/126750446