LeetCode#877 Stone Game

1、直接判胜;
2、计算从i到j的胜利点数。这里用超过对手的点数来表示胜负。
首先,既然d[0][n-1] = max(p[0]-d[1][n-1], p[n]-d[0][n-2] ,那么,这样依次扫描即可。但需要注意的是边界条件,即d[i][j] 是什么:需要计算每一个区间的最值。这里使用区间距离来拆分,即将其拆成多个长度为1/2/3…/n的区间分别计算每个区间最值,才能得出d[0][n-1]
因此两层循环,外层区间长度,内层遍历区间获取其最值。

class Solution {
public:
    bool stoneGame(vector<int>& piles) {
        vector<vector<int>> dp(piles.size(), vector<int>(piles.size(), 0));
        for(int i = 0; i < piles.size(); i++)
            dp[i][i] = piles[i];
        
        for(int d = 1; d < piles.size(); d++){
            for(int i = 0; i < piles.size()-d; i++){
                dp[i][i+d] = max(piles[i]-dp[i+1][i+d], piles[i+d]-dp[i][i+d-1]);
            }
        }
        
        return dp[0][piles.size()-1] > 0;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值