动态规划:1140、石子游戏II

思路:两个状态为开始取石子的索引i和可以取走的堆数M,我们最后要返回的结果为dp[0][1],所以我们的遍历顺序为从后往前,假设最后一次从i开始取石子,可以取走全部石子,则dp[i][M]等于剩余的所以石子数量和,如果不能全部取走,则dp[i][M]为使得下一个人取得最小的石子数量和。

class Solution {
public:
    int stoneGameII(vector<int>& piles) {
        int n=piles.size(),sum=0;
        vector<vector<int>>dp(n,vector<int>(n+1,0));
        for(int i=n-1;i>=0;i--){
            sum+=piles[i];
            for(int M=1;M<=n;M++){
                //可以取走全部石头
                if(i+2*M>=n){
                    dp[i][M]=sum;
                }else{
                    //本轮取走的堆数要保证下轮对手取走的堆数最小
                    for(int x=1;x<=2*M;x++){
                        dp[i][M]=max(dp[i][M],sum-dp[i+x][max(x,M)]);
                    }
                }
            }
        }
        return dp[0][1];
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值