leetcode_486. Predict the Winner
https://leetcode.com/problems/predict-the-winner/
題目描述:給定一個(gè)非負(fù)的積分?jǐn)?shù)組,玩家1可以從數(shù)組兩端任取一個(gè)積分,接著玩家2執(zhí)行同樣的操作,直至積分被取盡,總分大的獲勝。兩人都以最優(yōu)決策進(jìn)行游戲。對(duì)每個(gè)數(shù)組輸出玩家1是否能獲勝。
解法1:
使用遞歸,兩者依次取數(shù)。
?
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;elsereturn 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) //若從任意一端取數(shù)后,對(duì)手都勝,那么當(dāng)前玩家必?cái)?/span>return false;elsereturn 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;elsereturn true;}} };?
?
?
解法二:官方題解
對(duì)于兩個(gè)玩家而言,玩家1的總分s1,玩家2的總分s2,dis=s1-s2,若玩家1勝,dis>=0,否則dis<0。依舊使用遞歸,雙方依次取數(shù),玩家1希望差值越大越好,玩家2希望差值越小越好。
int dfs(vector<int>& nums, int st, int en, bool role)函數(shù)返回值為:在nums[st,en]上由role取數(shù)后的總分差值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];elsereturn -nums[st];}if(!role)return max(nums[st] + dfs(nums, st+1, en, !role), nums[en]+dfs(nums, st, en-1, !role));elsereturn min(-nums[st] + dfs(nums, st+1, en, !role), -nums[en]+dfs(nums, st, en-1, !role));} };
?
解法三:官方題解,動(dòng)態(tài)規(guī)劃
dp[st][en]:玩家1在nums[st,en]上取數(shù)過(guò)后的差值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]子數(shù)組上的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;} };?
轉(zhuǎn)載于:https://www.cnblogs.com/jasonlixuetao/p/10545715.html
總結(jié)
以上是生活随笔為你收集整理的leetcode_486. Predict the Winner的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于GCD多任务处理
- 下一篇: vue中v-for循环如何将变量带入cl