https://leetcode.com/problems/predict-the-winner/

题目描述:给定一个非负的积分数组,玩家1可以从数组两端任取一个积分,接着玩家2执行同样的操作,直至积分被取尽,总分大的获胜。两人都以最优决策进行游戏。对每个数组输出玩家1是否能获胜。

解法1:

使用递归,两者依次取数。

class Solution{
public:bool PredictTheWinner(vector<int>& nums){return dfs(nums, 0, nums.size()-1, 0, 0, 0);}bool dfs(vector<int>& nums, int st, int en, int p1, int p2, bool role){if(st == en){if(!role && p1+nums[st]>=p2)return true;else if(role && p1<p2+nums[st])return true;elsereturn false;}if(!role){bool c1 = dfs(nums, st+1,en,p1+nums[st],p2,!role);bool c2 = dfs(nums, st,en-1,p1+nums[en],p2,!role);if(c1 && c2)  //若从任意一端取数后,对手都胜,那么当前玩家必败return false;elsereturn true;}else{bool c1 = dfs(nums, st+1,en,p1,p2+nums[st],!role);bool c2 = dfs(nums, st,en-1,p1,p2+nums[en],!role);if(c1 && c2)return false;elsereturn true;}}
};

解法二:官方题解

对于两个玩家而言,玩家1的总分s1,玩家2的总分s2,dis=s1-s2,若玩家1胜,dis>=0,否则dis<0。依旧使用递归,双方依次取数,玩家1希望差值越大越好,玩家2希望差值越小越好。

int dfs(vector<int>& nums, int st, int en, bool role)函数返回值为:在nums[st,en]上由role取数后的总分差值dis。
class Solution{
public:bool PredictTheWinner(vector<int>& nums){return dfs(nums, 0, nums.size()-1, 0)>=0;}int dfs(vector<int>& nums, int st, int en, bool role){if(st == en){if(role == 0)return nums[st];elsereturn -nums[st];}if(!role)return max(nums[st] + dfs(nums, st+1, en, !role), nums[en]+dfs(nums, st, en-1, !role));elsereturn min(-nums[st] + dfs(nums, st+1, en, !role), -nums[en]+dfs(nums, st, en-1, !role));}
};

解法三:官方题解,动态规划

dp[st][en]:玩家1在nums[st,en]上取数过后的差值dis(dis=s1-s2)

在nums[st][en]上的dis: dp[st][en]取决于{num[st], dp[st+1][en]}和{num[en], dp[st][en-1]},即仅取决于nums[st][en]子数组上的dp和num[st],num[en]。

class Solution{
public:bool PredictTheWinner(vector<int>& nums){int dp[25][25];memset(dp,0,sizeof(dp));for(int tail=1; tail<nums.size(); tail++)for(int head=tail; head>=0; head--){int get_head = nums[head] - dp[head+1][tail];int get_tail = nums[tail] - dp[head][tail-1];dp[head][tail] = max(get_head, get_tail);}return dp[0][nums.size()-1]>=0;}
};

转载于:https://www.cnblogs.com/jasonlixuetao/p/10545715.html

leetcode_486. Predict the Winner相关推荐

  1. LeetCode - 486. Predict the Winner(排成一条线的纸牌博弈问题)

    LeetCode - 486. Predict the Winner(排成一条线的纸牌博弈问题) 递归解法 动态规划解法 题目链接 题目 递归解法 定义递归函数f[i,j],表示的是如果arr[i.. ...

  2. 【leetcode】486. Predict the Winner

    题目如下: Given an array of scores that are non-negative integers. Player 1 picks one of the numbers fro ...

  3. LeetCode486. Predict the Winner题解

    1. 题目描述 Given an array of scores that are non-negative integers. Player 1 picks one of the numbers f ...

  4. LeetCode题解(Week 9):486. Predict the Winner

    原题目: Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from ...

  5. 486. Predict the Winner | 486. 预测赢家(博弈论)

    题目 https://leetcode.com/problems/predict-the-winner/ 题解 这道题和 leetcode 877. Stone Game | 877. 石子游戏(递归 ...

  6. 继续过中等难度.0309

      .   8  String to Integer (atoi)    13.9% Medium   . 151 Reverse Words in a String      15.7% Mediu ...

  7. LeetCode刷题记录+数据结构总结

    题号 思路 时间 8. String to Integer (atoi) 没想到有限自动机,写的太臃肿,边界条件考虑的也不足,用DFA分析起来就会很舒服 2020.4.3 11. Container ...

  8. 寒假LeetCode打卡

    文章目录 @[toc] 链表专题 LeetCode 19. Remove Nth Node From End of List LeetCode 83. Remove Duplicates from S ...

  9. 苹果阻止升级插件ios12_苹果推出iOS 14,具有小部件和多项应用程序升级

    苹果阻止升级插件ios12 It's safe to say that iOS 13 has been troublesome at best. The latest iPhone software ...

最新文章

  1. Linux 添加ssh 公钥访问
  2. DL框架之Caffe:深度学习框架之Caffe的简介、安装、使用方法详细攻略
  3. router3 BGP1 基础部分
  4. Java PushbackReader ready()方法与示例
  5. 【Java】统计字符串中每个字符出现的次数
  6. python怎样填充颜色_python – 使用颜色填充Tkinter画布对象之间的空间
  7. 书山有路28期预告:《人性的枷锁》
  8. linux gcc下实现简单socket套接字小程序
  9. 吾讲救活公司的办法,当事人还在玩手机,应该怎么办
  10. SEO经验分享之百度知道篇
  11. Unity世界坐标转换屏幕坐标(测试)
  12. 【组合数学】 牡牛和牝牛
  13. 6713芯片手册_tms320c6713 gpio_tms320c6713_dsp6713中文手册
  14. 对计算机专业的认识和未来规划,对计算机专业的认识及学业规划
  15. SCDM学习笔记(5)
  16. 数商云大宗商品交易平台案例:打造B2B大宗电商供应链服务系统,落地产业互联网
  17. openstack 网络更改版
  18. 招行首发芭比娃娃MP3
  19. vue.js实现单选框、复选框和下拉框
  20. 网易2017春招 魔力手环 矩阵快速幂

热门文章

  1. 040_CSS3背景
  2. go 公众号 关注 监听_荐号丨推荐五个适合法学院关注公众号
  3. python 对象销毁_python对象销毁实例(垃圾回收)
  4. jQuery Mobile 快速入门
  5. 用python画竹子_python函数
  6. linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递
  7. onedrive目录PHP源码,另一个OneDrive目录索引应用 OLAINDEX
  8. 地图上制作线路的动画_魔兽争霸重制版不只是表面上这么简单,新版编辑器制作地图更容易...
  9. 华为云计算之储存基础知识
  10. Zabbix实战之客户端自动注册