国产探花免费观看_亚洲丰满少妇自慰呻吟_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;    }};


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 河西区| 韩城市| 株洲县| 榆林市| 镇江市| 万荣县| 托里县| 麦盖提县| 平顶山市| 巧家县| 景宁| 鹤壁市| 巧家县| 昌邑市| 玉环县| 资兴市| 集贤县| 莎车县| 巨野县| 石嘴山市| 宜都市| 宾川县| 城市| 白山市| 孝感市| 封丘县| 勃利县| 志丹县| 万源市| 平塘县| 勐海县| 梓潼县| 资中县| 铁力市| 澄江县| 彰化县| 若尔盖县| 栾川县| 广州市| 兴业县| 白河县|