★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-tjolcfxk-me.html
➤若是连接不是山青咏芝的博客园地址,则多是爬取做者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持做者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html
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.git
Given an array of scores, predict whether player 1 is the winner. You can assume each player plays to maximize his score.github
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:spa
给定一个表示分数的非负整数数组。 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,而后玩家1拿,……。每次一个玩家只能拿取一个分数,分数被拿取以后再也不可取。直到没有剩余分数可取时游戏结束。最终得到分数总和最多的玩家获胜。code
给定一个表示分数的数组,预测玩家1是否会成为赢家。你能够假设每一个玩家的玩法都会使他的分数最大化。htm
示例 1:blog
输入: [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能够成为赢家。
注意:
1 class Solution { 2 func PredictTheWinner(_ nums: [Int]) -> Bool { 3 var nums = nums 4 var n:Int = nums.count 5 var dp:[[Int]] = [[Int]](repeating:[Int](repeating:-1,count:n),count:n) 6 return canWin(&nums, 0, n - 1, &dp) >= 0 7 } 8 9 func canWin(_ nums:inout [Int],_ s:Int,_ e:Int,_ dp:inout [[Int]]) -> Int 10 { 11 if dp[s][e] == -1 12 { 13 dp[s][e] = (s == e) ? nums[s] : max(nums[s] - canWin(&nums, s + 1, e, &dp), nums[e] - canWin(&nums, s, e - 1, &dp)) 14 } 15 return dp[s][e] 16 } 17 }