博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode_486. Predict the Winner
阅读量:5991 次
发布时间:2019-06-20

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

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

解法1:

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

 

class Solution{public:bool PredictTheWinner(vector
& nums){
return dfs(nums, 0, nums.size()-1, 0, 0, 0); } bool dfs(vector
& 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

 

 

 

解法二:官方题解

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

int dfs(vector
& nums, int st, int en, bool role) 函数返回值为:在nums[st,en]上由role取数后的总分差值dis。
class Solution{public:bool PredictTheWinner(vector
& nums){
return dfs(nums, 0, nums.size()-1, 0)>=0; } int dfs(vector
& nums, int st, int en, bool role){ if(st == en){ if(role == 0) return nums[st]; else return -nums[st]; } if(!role) return max(nums[st] + dfs(nums, st+1, en, !role), nums[en]+dfs(nums, st, en-1, !role)); else return 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
& nums){ int dp[25][25]; memset(dp,0,sizeof(dp)); for(int tail=1; tail
=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

你可能感兴趣的文章
Flex: 数据绑定将无法检测对“***”的指定
查看>>
【C++学习】显式构造函数
查看>>
gpFinder 2.0 发布
查看>>
分享:再谈字符串编码与HTTP协议
查看>>
Lambda 表达式(C# 编程指南)
查看>>
分享:EJDB 1.0.37 发布,嵌入式 JSON 数据库引擎
查看>>
[Z]Marching Cubes的实现
查看>>
学习之路二十一:设置DataGridView中的按钮为Disable
查看>>
【转】各种类之间的关系
查看>>
【SAS NOTE】sas 9.2 安装
查看>>
The connection to adb is down, and a severe error has occured.问题解决
查看>>
Servlet 单例多线程
查看>>
Java-对象多态性
查看>>
Android点击Button实现功能的几种方法
查看>>
uva 592 Island of Logic (收索)
查看>>
【转载】shell中 dd 命令
查看>>
八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)...
查看>>
骨传导技术(转)
查看>>
Ubuntu 下忘记mysql 密码
查看>>
混沌分形之谢尔宾斯基(Sierpinski)
查看>>