日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

leetcode_486. Predict the Winner

發(fā)布時(shí)間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode_486. Predict the Winner 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。