美文网首页
877.石子游戏(中等)

877.石子游戏(中等)

作者: 滨岩 | 来源:发表于2021-08-26 01:32 被阅读0次

参考:
https://labuladong.gitbook.io/algo/mu-lu-ye-2/mu-lu-ye-4/dong-tai-gui-hua-zhi-bo-yi-wen-ti

 /**
     * piles=[3,9,1,2]
     *
     * @param piles
     * @return
     */
    public boolean stoneGame(int[] piles) {
        int n = piles.length;

        if (n <= 0) {
            return false;
        }

        StonePair[][] dp = new StonePair[n][n];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                dp[i][j] = new StonePair();
                dp[i][j].first = 0;
                dp[i][j].second = 0;
            }
        }

        //dp[i][j] 代表的是  piles[i...j] 的中先手和后手的最大值
        //比如  dp[0,1]  就是[3,9]={9,3}  先手拿9  后手只能拿3
        for (int i = 0; i < n; i++) {
            dp[i][i].first = piles[i];
            dp[i][i].second = 0;
        }

        //斜着遍历数组
        for (int left = 2; left <= n; left++) {
            for (int i = 0; i <= n - left; i++) {
                //i 从左边开始     j 从右边开始
                int j = left + i - 1;

                // 这次先手,那么就相当于下次的后手  选piles[i]  还是 选piles[j]
                //dp[i][j].first = Math.max(piles[i] + dp[i + 1][j].second, piles[j] + dp[i][j - 1].second);

                // 下面的这两行 相当于 上面的   Math.max(piles[i] + dp[i + 1][j].second, piles[j] + dp[i][j - 1].second); 的拆分
                int leftPiles = piles[i] + dp[i + 1][j].second;


                int rightPiles = piles[j] + dp[i][j - 1].second;

                //如果 先手选择 piles[i]
                if (leftPiles > rightPiles) {
                    //如果 先手选择 piles[i]
                    dp[i][j].first = leftPiles;
                    dp[i][j].second = dp[i + 1][j].first;
                } else {
                    //如果 先手选择 piles[j]
                    dp[i][j].first = rightPiles;
                    dp[i][j].second = dp[i][j - 1].first;
                }
            }
        }

        //dp[0][n-1]  相当于 就是 选piles[ 0.... n-1]
        StonePair stonePairs = dp[0][n - 1];

        return (stonePairs.first - stonePairs.second) >= 0;
    }
public class StonePair {



    public StonePair() {
    }
    public StonePair(int first, int second) {
        this.first = first;
        this.second = second;
    }

    public int first;
    public int second;
}

相关文章

  • 877.石子游戏(中等)

    参考:https://labuladong.gitbook.io/algo/mu-lu-ye-2/mu-lu-ye...

  • 100天代码挑战:DAY10

    LeetCode 877. 石子游戏 亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 p...

  • LeetCode 877. 石子游戏

    1、题目 877. 石子游戏 2、题解 首先,一开始我觉得这道题目并不严谨。因为我大略感觉到先手选择的人就能赢得这...

  • Leetcode 877. 石子游戏

    题目描述 亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。 游戏以谁...

  • LeetCode-python 877. 石子游戏

    题目链接难度: 中等 类型:动态规划 亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都...

  • 取石子游戏

    题目:取石子游戏思路:这道题我是没有做出来,主要是我并没有找到相应的规律,后来参考了网上的算法,说这道题是威尔佐夫...

  • 取石子游戏

    Description 有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法...

  • T877、石子游戏

    亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。游戏以谁手中的石子最...

  • 组合游戏略述——浅谈SG游戏的若干拓展及变形

    Anti-SG 游戏桌子上有 N 堆石子,游戏者轮流取石子。每次只能从一堆中取出任意数目的石子,但不能不取。...

  • HDU-5795 NIM游戏简单变形 [2016多校]

    经典NIM游戏的一个简单变形,游戏中有N堆石子,每次走步可以选择: 取走某堆的任意个石子(不可不取); 将石子拆分...

网友评论

      本文标题:877.石子游戏(中等)

      本文链接:https://www.haomeiwen.com/subject/fxjyiltx.html