国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

[leetcode]486. Predict the Winner

2019-11-11 06:04:44
字體:
來源:轉載
供稿:網友

題目鏈接:https://leetcode.com/PRoblems/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: FalseExplanation: 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: TrueExplanation: 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.

方法一(超時):

class Solution{public:    bool PredictTheWinner(vector<int>& nums)    {        //vector[start][end]代表nums的頭索引為start,尾索引為end時player1得到的最大的score        vector<vector<int>> scores(20,vector<int>(20,0));        int sum=accumulate(nums.begin(),nums.end(),0);        int target=(sum%2)?sum/2+1:sum/2;        return maxScore(nums,0,nums.size()-1,scores)>=target;    }    int maxScore(vector<int>& nums,int start,int end,vector<vector<int>> scores)    {        if(start>end)            return 0;        if(start==end)            return nums[start];        if(scores[start][end])            return scores[start][end];        int res1=nums[start]+min(maxScore(nums,start+2,end,scores),maxScore(nums,start+1,end-1,scores));        int res2=nums[end]+min(maxScore(nums,start,end-2,scores),maxScore(nums,start+1,end-1,scores));        scores[start][end]=max(res1,res2);        return scores[start][end];    }};方法二(超時):

class Solution{public:    bool PredictTheWinner(vector<int>& nums)    {        //vector[start][end]代表nums的頭索引為start,尾索引為end時player1是否比player2大,即是否大于等于0        vector<vector<int>> scores(nums.size(),vector<int>(nums.size(),INT_MAX));        int res=maxScore(nums,0,nums.size()-1,scores);        return res>=0;    }    int maxScore(vector<int>& nums,int start,int end,vector<vector<int>> scores)    {        if(scores[start][end]==INT_MAX)            scores[start][end]=start==end?nums[start]:max(nums[start]-maxScore(nums,start+1,end,scores),            nums[end]-maxScore(nums,start,end-1,scores));        return scores[start][end];    }};方法三(方法二的非遞歸版):

class Solution{public:    bool PredictTheWinner(vector<int>& nums) {        //vector[start][end]代表nums的頭索引為start,尾索引為end時player1是否比player2大,即是否大于等于0        vector<vector<int>> scores(nums.size(), vector<int>(nums.size(), 0));        for(int i=0;i<nums.size()-1;i++)            scores[i][i]=nums[i];        for(int i=nums.size()-2;i>=0;i--)        {            for(int j=i+1;j<nums.size();j++)            {                scores[i][j]=max(nums[i]-scores[i+1][j],nums[j]-scores[i][j-1]);            }        }        return scores[0][nums.size()-1]>=0;    }};


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三江| 德格县| 桃园县| 永康市| 乌拉特前旗| 乌海市| 庆城县| 和硕县| 工布江达县| 连云港市| 额济纳旗| 长春市| 宁海县| 读书| 苍梧县| 嵊泗县| 平凉市| 垣曲县| 轮台县| 大石桥市| 聂拉木县| 曲沃县| 贡嘎县| 古蔺县| 莲花县| 石狮市| 宁乡县| 申扎县| 渭源县| 旺苍县| 温宿县| 黄龙县| 武定县| 平泉县| 田林县| 吉水县| 厦门市| 金川县| 出国| 宝山区| 南漳县|