动态规划:博弈问题之石子游戏

14 篇文章 0 订阅
10 篇文章 0 订阅

在这里插入图片描述

方法一:数学法

先手可以控制自己拿所有下标为奇数的石堆或者拿所有下标为偶数的石堆,只要先计算一下奇数石堆的石子总数和偶数石堆的石子总数哪种多就选哪种,所以先手总会赢

return true

方法二:动态规划

假设先手和后手都最聪明的情况下,返回先手和后手拿到的石头个数之差

dp数组定义:dp[i][j][0]从下标i到j堆石头,先手能获得的最大数量;dp[i][j][1]表示后手
在这里插入图片描述

public boolean stoneGame(int[] piles) {
        int n = piles.length;
        int[][][] dp = new int[n][n][2];//dp数组定义:dp[i][j][0]从下标i到j堆石头,先手能获得的最大数量;dp[i][j][1]表示后手
        for(int i=0;i<n;i++){ //base case:当i=j时,先手拿完了,后手没得拿
            dp[i][i][0] = piles[i];
            dp[i][i][1] = 0;
        }
        for(int i=n-2;i>=0;i--){//从下到上,从左到右遍历
            for(int j=i+1;j<n;j++){
                int left = piles[i]+dp[i+1][j][1];
                int right = piles[j]+dp[i][j-1][1];
                if(left>right){
                    dp[i][j][0] = left;
                    dp[i][j][1] = dp[i+1][j][0];
                }
                else{
                    dp[i][j][0] = right;
                    dp[i][j][1] = dp[i][j-1][0];
                }
            }
        }
        return dp[0][n-1][0]>dp[0][n-1][1];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值