leetCode 877. Stone Game

一堆石头,用一个数组表示各堆石头大小,alice和lee选,都只能从头或尾选石头,谁的大就谁赢。求:是否一定能找到赢的方法

class Solution {
public:
    bool stoneGame(vector<int>& piles) {
        int t=piles.size();
        vector<vector<int> >dp(t+1,vector<int>(t,0));
        //dp[i][j]为从第i堆石头到第j堆石头中alice跟lee选择的石头差值的最大值
        //最终需要求的值是dp[0][t-1],这需要知道dp[0][t-2](即第一种可能:alice选的是最后一个石头)和dp[1][t-1](即另一种可能:alice选的是第一个石头),依次类推,发现对角线上的值是要事先要知道的,且大小为第i堆石头的大小
        for(int i=0;i<t;i++)
            dp[i][i]=piles[i];
        for(int i=t-2;i>=0;i--)
            for(int j=i+1;j<t;j++){
                //alice选择第i个或j个,那lee从i+1到j或i到j-1选择1个
                dp[i][j]=max(piles[i]-dp[i+1][j],piles[j]-dp[i][j-1]);
        }
        return dp[0][t-1]>0;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值