stone game ii 1140

leetcode https://leetcode.com/problems/stone-game-ii/

是stone game的进阶

递归

public int stoneGameII(int[] piles) {
        int len=piles.length;
        if(len<1)return 0;
        if(len<2)return piles[0];
        int dp[][]=new int[len][len*2];
        int sum[]=new int[len];
        for(int i=len-1;i>=0;i--){
            sum[i]+=(i+1

动态规划

public:
    int stoneGameII(vector& piles) {
        int len = piles.size();
        vector> dp(len, vector(len, 0));
        vector sum(len, 0);
        // 逆序部分和
        sum.back() = piles.back();
        for(int i=len-2; i>=0; i--) sum[i] = sum[i+1] + piles[i];
        // 倒着查找  dp[i][j] 代表当前在 i 位置,且此时 M = j-1  可以获得的最大收益
        for(int i=len-1; i>=0; i--)
            // 把可能情况都探索一遍,其中 M 的可能大小为 1 到 len
            for(int j=0; j= len-i) dp[i][j] = sum[i];
                else{
                    // 一次拿不完的情况,取最大值
                    for(int k=1; k<=2*M; k++)
                        dp[i][j] = max(dp[i][j], sum[i]-dp[i+k][max(k, M)-1]);
                }
            }
        return dp[0][0];
    }

 

你可能感兴趣的:(java,算法)