leetcode-486-Predict the Winner
Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from either end of the array followed by the player 2 and then player 1 and so on. Each time a player picks a number, that number will not be available for the next player. This continues until all the scores have been chosen. The player with the maximum score wins.
Given an array of scores, predict whether player 1 is the winner. You can assume each player plays to maximize his score.
Example 1:
Input: [1, 5, 2]
Output: False
Explanation: Initially, player 1 can choose between 1 and 2.
If he chooses 2 (or 1), then player 2 can choose from 1 (or 2) and 5. If player 2 chooses 5, then player 1 will be left with 1 (or 2).
So, final score of player 1 is 1 + 2 = 3, and player 2 is 5.
Hence, player 1 will never be the winner and you need to return False.
Example 2:
Input: [1, 5, 233, 7]
Output: True
Explanation: Player 1 first chooses 1. Then player 2 have to choose between 5 and 7. No matter which number player 2 choose, player 1 can choose 233.
Finally, player 1 has more score (234) than player 2 (12), so you need to return True representing player1 can win.
Note:
- 1 <= length of the array <= 20.
- Any scores in the given array are non-negative integers and will not exceed 10,000,000.
- If the scores of both players are equal, then player 1 is still the winner.
思路:
参考自
http://www.voidcn.com/blog/starstar1992/article/p-6497962.html
https://discuss.leetcode.com/topic/76472/clean-3ms-c-dp-solution-with-detailed-explanation
https://discuss.leetcode.com/topic/76327/c-dp-solution-with-explanation
bool PredictTheWinner(vector<int>& nums)
{
int n = nums.size();
vector<vector<int>>dp(n, vector<int>(n));
vector<int>sum(n);
sum[] = nums[];
dp[][] = nums[];
for (int i = ; i < n;i++)
{
sum[i] += sum[i - ] + nums[i];
dp[i][i] = nums[i];
}
for (int i = ; i < n;i++)
{
for (int j = ; i + j < n;j++)
{
dp[j][i + j] = max(sum[i+j]-sum[j]+nums[j] -dp[j+][i+j],sum[i+j]-sum[j]+nums[j]-dp[j][i+j-]);
}
}
return * dp[][n - ] >= sum[n - ];
}

如上图所示,dp为二维数组,最终要求得是dp[0][n-1]那么,需要不断的去迭代更新dp[i][j]的值。求得过程类似上图,从对角线的上方
从左上到右下求dp[i][j]的值。也就是说求dp[i][j]需要用到它左边和下边的值 即左边dp[i][j-1]和下边dp[i+1][j]的值。
这一题用动态规划来解决。
对于原数组A[0,….,n-1],我们定义
dp[i][j]表示原数组中从i到j的这么多数中,按照游戏规则,某个玩家所能获得的最大分数。
假设这个分数此时属于palyer1,那么dp[i+1][j]或者dp[i][j-1]表示player2玩家所能获得的最大分数。因为对于player1来讲,他第一次选择要么是第i个数,要么是第j个数,所以对于player2来讲,就分两种情况取最大。
另外我们设从i到j的所有数的和是sum[i,j],则可以得到递推公式:(动态规划最明显的标识)
dp[i][j]=max(sum[i+1][j]-dp[i+1][j]+nums[i], sum[i][j-1]-dp[i][j-1]+nums[j]) 。
这个需要好好想想!其实不难!
化简一下:
dp[i][j]=max(sum[i][j]-dp[i+1][j], sum[i][j]-dp[i][j-1]) 。
但是写代码实现时,我们要注意:
首先要得到dp[i][i]的值,之后依次得到:
dp[0][1],dp[1,2],dp[2,3]…dp[n-2][n-1]
之后再得到dp[0][2],dp[1][3],…
for(int i=1;i<n;i++)
for(int j=0;i+j<n;j++)
dp[j][i+j]=max(sum[i+j]-sum[j]+nums[j]-dp[j+1][i+j],sum[i+j]-sum[j]+nums[j]-dp[j][i+j-1]);
所以这段代码的实现意图就比较明显了!
另外,注意sum[i+j]-sum[j]+nums[j]而不用sum[i+j]-sum[j-1]来求解从i到j的和,是为了考虑j=0时的情况。
细节处比较多,很考察能力!
leetcode-486-Predict the Winner的更多相关文章
- LN : leetcode 486 Predict the Winner
lc 486 Predict the Winner 486 Predict the Winner Given an array of scores that are non-negative inte ...
- [LeetCode] 486. Predict the Winner 预测赢家
Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from eith ...
- 随手练——博弈论入门 leetcode - 486. Predict the Winner
题目链接:https://leetcode.com/problems/predict-the-winner/ 1.暴力递归 当前数组左边界:i,右边界:j: 对于先发者来说,他能取到的最大值是:max ...
- [leetcode] 486. Predict the Winner (medium)
原题 思路: 解法一: 转换比较拿取分数多少的思路,改为考虑 player拿的分数为正,把Player2拿的视为负,加上所有分数,如果最后结果大于0则Player1赢. 思考得出递归表达式: max( ...
- 【LeetCode】486. Predict the Winner 解题报告(Python)
[LeetCode]486. Predict the Winner 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: ht ...
- LC 486. Predict the Winner
Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from eith ...
- 【leetcode】486. Predict the Winner
题目如下: Given an array of scores that are non-negative integers. Player 1 picks one of the numbers fro ...
- 486. Predict the Winner
Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from eith ...
- 486 Predict the Winner 预测赢家
给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,…….每次一个玩家只能拿取一个分数,分数被拿取之后不再可取.直到没有剩余分数 ...
- Leetcode之动态规划(DP)专题-486. 预测赢家(Predict the Winner)
Leetcode之动态规划(DP)专题-486. 预测赢家(Predict the Winner) 给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端 ...
随机推荐
- 关于Dubbo一个接口多个实现的解决方案
如题,其实这个问题在官方文档中已经说明了.我直接贴图就好了 更多学习请参考:minglisoft.cn/technology
- Android零碎知识(一)
public abstract Resources getResources () Return a Resources instance for your application's package ...
- OpenStack(企业私有云)万里长征第二步——使用Fuel部署
一.前言 最近一直在使用DevStack来安装OpenStack,注意一直二字,部署了一遍又一遍,操作系统怕是安装了不下上百次,有时是为了验证新的方案,有时是安装出错,还有时是运行过程中出错.总之是碰 ...
- iOS学习之应用之间的操作(转发)
首先要说的是每一个APP都可以设置一个自己独有的URL,APP应用之间的操作就是通过这个URL来实现的! 1.如何配置自己应用的URL? 关于自己的URL,作为资深的程序猿都会想到 Info.plis ...
- laravel实现excel表格导出
记得引用一下excel,现在laravel5.2都默认自带的,不需要自己再 Composer安装依赖了. use Excel; 然后方法里这样写 //$cellData自己要进行导出的数组 Array ...
- R语言的导数计算(转)
转自:http://blog.fens.me/r-math-derivative/ 前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识.我在学习高数的时候绞尽 ...
- 1.Node.js 接入微信公众平台开发
一.写在前面的话 Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...
- php curl_setopt的相关设置查询手册
bool curl_setopt (int ch, string option, mixed value) curl_setopt()函数将为一个CURL会话设置选项.option参数是你想要的设置, ...
- Redis基本数据结构总结之STRING和LIST
Redis基本数据结构总结前言 Redis的特点在于其读写速度特别快,因为是存储在内存中的,其非常适合于处理大数据量的情况:还有一个是其不同于其他的关系型数据库,Redis是非关系型数据库,也就是我们 ...
- Python os.walk的用法与举例
os.walk(top, topdown=True, onerror=None, followlinks=False) 可以得到一个三元tupple(dirpath, dirnames, filena ...