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

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

[leetcode]486. Predict the Winner

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

題目鏈接: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;    }};


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永城市| 乐清市| 宁夏| 延吉市| 温州市| 越西县| 运城市| 平武县| 扶沟县| 会同县| 霍山县| 山西省| 岐山县| 宁德市| 乌海市| 平塘县| 平和县| 钟山县| 泗洪县| 吉木乃县| 翁源县| 津南区| 永泰县| 西宁市| 安远县| 诸城市| 阳谷县| 新乡县| 常宁市| 天峨县| 开封市| 大港区| 扎兰屯市| 新河县| 九龙城区| 聂荣县| 临汾市| 浮梁县| 台山市| 全州县| 商丘市|