其他分享
首页 > 其他分享> > leetcode_486. Predict the Winner

leetcode_486. Predict the Winner

作者:互联网

https://leetcode.com/problems/predict-the-winner/

题目描述:给定一个非负的积分数组,玩家1可以从数组两端任取一个积分,接着玩家2执行同样的操作,直至积分被取尽,总分大的获胜。两人都以最优决策进行游戏。对每个数组输出玩家1是否能获胜。

解法1:

使用递归,两者依次取数。

 

class Solution{
public:bool PredictTheWinner(vector<int>& nums){return dfs(nums, 0, nums.size()-1, 0, 0, 0);
    }
    bool dfs(vector<int>& nums, int st, int en, int p1, int p2, bool role){
        if(st == en){
            if(!role && p1+nums[st]>=p2)
                return true;
            else if(role && p1<p2+nums[st])
                return true;
            else
                return false;
        }
        if(!role){
            bool c1 = dfs(nums, st+1,en,p1+nums[st],p2,!role);
            bool c2 = dfs(nums, st,en-1,p1+nums[en],p2,!role);
            if(c1 && c2)  //若从任意一端取数后,对手都胜,那么当前玩家必败
                return false;
            else
                return true;
        }else{
            bool c1 = dfs(nums, st+1,en,p1,p2+nums[st],!role);
            bool c2 = dfs(nums, st,en-1,p1,p2+nums[en],!role);
            if(c1 && c2)
                return false;
            else
                return true;
        }
    }
};

 

 

 

解法二:官方题解

对于两个玩家而言,玩家1的总分s1,玩家2的总分s2,dis=s1-s2,若玩家1胜,dis>=0,否则dis<0。依旧使用递归,双方依次取数,玩家1希望差值越大越好,玩家2希望差值越小越好。

int dfs(vector<int>& nums, int st, int en, bool role)
函数返回值为:在nums[st,en]上由role取数后的总分差值dis。
class Solution{
public:bool PredictTheWinner(vector<int>& nums){return dfs(nums, 0, nums.size()-1, 0)>=0;
    }
    int dfs(vector<int>& nums, int st, int en, bool role){
        if(st == en){
            if(role == 0)
                return nums[st];
            else
                return -nums[st];
        }
        if(!role)
            return max(nums[st] + dfs(nums, st+1, en, !role), nums[en]+dfs(nums, st, en-1, !role));
        else
            return min(-nums[st] + dfs(nums, st+1, en, !role), -nums[en]+dfs(nums, st, en-1, !role));
    }
};

 

解法三:官方题解,动态规划

dp[st][en]:玩家1在nums[st,en]上取数过后的差值dis(dis=s1-s2)

在nums[st][en]上的dis: dp[st][en]取决于{num[st], dp[st+1][en]}和{num[en], dp[st][en-1]},即仅取决于nums[st][en]子数组上的dp和num[st],num[en]。

class Solution{
public:
    bool PredictTheWinner(vector<int>& nums){
        int dp[25][25];
        memset(dp,0,sizeof(dp));
        for(int tail=1; tail<nums.size(); tail++)
            for(int head=tail; head>=0; head--){
                int get_head = nums[head] - dp[head+1][tail];
                int get_tail = nums[tail] - dp[head][tail-1];
                dp[head][tail] = max(get_head, get_tail);
            }
        return dp[0][nums.size()-1]>=0;
    }
};

 

标签:en,nums,Predict,Winner,st,int,role,486,dp
来源: https://www.cnblogs.com/jasonlixuetao/p/10545715.html