博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
486. 预测赢家
阅读量:4028 次
发布时间:2019-05-24

本文共 1230 字,大约阅读时间需要 4 分钟。

给定一个表示分数的非负整数数组。 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,……。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。

给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。

示例 1:

输入: [1, 5, 2]输出: False解释: 一开始,玩家1可以从1和2中进行选择。如果他选择2(或者1),那么玩家2可以从1(或者2)和5中进行选择。如果玩家2选择了5,那么玩家1则只剩下1(或者2)可选。所以,玩家1的最终分数为 1 + 2 = 3,而玩家2为 5。因此,玩家1永远不会成为赢家,返回 False。

示例 2:

输入: [1, 5, 233, 7]输出: True解释: 玩家1一开始选择1。然后玩家2必须从5和7中进行选择。无论玩家2选择了哪个,玩家1都可以选择233。最终,玩家1(234分)比玩家2(12分)获得更多的分数,所以返回 True,表示玩家1可以成为赢家。

思路:动态规划解决。dp[i][j] 表示玩家在数组 i 到 j 区间内游戏能赢对方的最大值(i <= j)。dp作记忆数组,减少计算量。

(1)当 i==j 时,dp[i][j] 等于 nums[i]。

(2)当 i != j 时,若先手取左端 nums[i],后手则为 dp[i+1][j] ,若先手取右端 nums[j],后手则为dp[i][j-1],故状态转移方程为 dp[i][j] = max(nums[i] - dp[i-1][j], nums[j] - dp[i][j-1])。

dp[0][nums.size()-1]大于等于0,则能赢,否则不能赢。

class Solution {public:    int canWin(vector
>&dp, int s, int e, vector
& nums){ if(dp[s][e]) return dp[s][e]; if(s==e) return nums[s]; return max(nums[s]-canWin(dp, s+1, e, nums), nums[e]-canWin(dp, s, e-1, nums)); } bool PredictTheWinner(vector
& nums) { int n=nums.size(); vector
>dp(n, vector
(n)); return canWin(dp, 0, n-1, nums)>=0; }};

 

转载地址:http://yuobi.baihongyu.com/

你可能感兴趣的文章
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>
jtag dump内存数据
查看>>
linux和windows内存布局验证
查看>>
linux config
查看>>
linux insmod error -1 required key invalid
查看>>
linux kconfig配置
查看>>
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>
linux dump_backtrace
查看>>
linux irqdebug
查看>>
git 常用命令
查看>>
linux位操作API
查看>>
snprintf 函数用法
查看>>
uboot.lds文件分析
查看>>
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>