动态规划学习-Leetcode-877题石子游戏

亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。

游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。

亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。
这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。

假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。

示例:

输入:[5,3,4,5] 输出:true 解释: 亚历克斯先开始,只能拿前 5 颗或后 5 颗石子 。 假设他取了前 5 颗,这一行就变成了
[3,4,5] 。 如果李拿走前 3 颗,那么剩下的是 [4,5],亚历克斯拿走后 5 颗赢得 10 分。 如果李拿走后 5
颗,那么剩下的是 [3,4],亚历克斯拿走后 4 颗赢得 9 分。 这表明,取前 5 颗石子对亚历克斯来说是一个胜利的举动,所以我们返回
true 。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/stone-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路
利用dp数组存储从i->j的石头堆里拿取一堆石头的最好最高分数。
dp[0][n-1]就是从第1堆到第N堆石头所得分数
目前做到了中等难度的动态规划,还是没什么思路,只能靠评论区点拨一二。继续努力!

class Solution {
public:
    bool stoneGame(vector<int>& piles) {
    int n=piles.size();
    vector<vector<int>>dp(piles.size(), vector<int>(piles.size()));//定义二维数组存储从i->j 一共能赢多少分
    for(int i=0;i<n;i++)
    {
        dp[i][i]=piles[i];//选择i->i就是直接拿走这些分数
    }
    for(int distance=1;distance<n;distance++)//distance是石子堆之间距离
    {
        for(int j=0;j<n-distance;j++)//每轮循环都从0开始记录 比如0->0+distance石头堆的分数
        {
          dp[j][j+distance]=max(piles[j]-dp[j+1][j+distance]
          ,piles[j+distance]-dp[j][j+distance-1]);
          //piles[j]-dp[j+1][j+distance]代表我拿了j的石头分数再减去另一个人拿了剩下石头的分数
        }
       
    }
     return dp[0][n-1]>0;//如果从0到n-1的分数大于0则赢
}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值