877. 石子游戲 力扣 中等 博弈
阿新 • • 發佈:2021-06-16
題目描述:
亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子piles[i]。
遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。
亞歷克斯和李輪流進行,亞歷克斯先開始。 每回合,玩家從行的開始或結束處取走整堆石頭。 這種情況一直持續到沒有更多的石子堆為止,此時手中石子最多的玩家獲勝。
假設亞歷克斯和李都發揮出最佳水平,當亞歷克斯贏得比賽時返回true,當李贏得比賽時返回false。
示例:
輸入:[5,3,4,5]
輸出:true
解釋:
亞歷克斯先開始,只能拿前 5 顆或後 5 顆石子 。
假設他取了前 5 顆,這一行就變成了 [3,4,5] 。
如果李拿走前 3 顆,那麼剩下的是 [4,5],亞歷克斯拿走後 5 顆贏得 10 分。
如果李拿走後 5 顆,那麼剩下的是 [3,4],亞歷克斯拿走後 4 顆贏得 9 分。
這表明,取前 5 顆石子對亞歷克斯來說是一個勝利的舉動,所以我們返回 true 。
題解:
奇偶數對
我們設陣列總長度為n,並且已知n%2 == 0:
當先手取第一位時,剩下的位置是 2~n, 後手能取的位置為2或n,都為偶數位置。 後手取後總長度變為n-2,產生遞迴。
當先手取最後一位時,.......,後手只能取1或n-1,都為奇數位置。 後手取......遞迴。
不難看出,先手取的位置必定限制了後手能取的位置,即: 先手取首位後手只能取偶數位,先手取末位後手只能取奇數位。 因此先手只需要計算好奇偶數位總和,則必贏。
https://leetcode-cn.com/problems/stone-game/solution/wei-shi-yao-zong-wei-true-by-xxx_-2-jes7/
class Solution { public: bool stoneGame(vector<int>& piles) { /* int l=piles.size(); int x=0,y=0; int i=0,j=l-1; while(i<j) //for(int t=1;t<=l/2;t++) { if(piles[i+1]+piles[j]>piles[i]+piles[j-1]) {x+=piles[j]; j--;} else {x+=piles[i]; i++;} if (i!=j) { if(piles[i+1]+piles[j]>piles[i]+piles[j-1]) {y+=piles[j]; j--;} else {y+=piles[i]; i++;} } else y+=piles[i]; } bool res; if (x>y) res=true; else res= false; return res;*/ //錯誤做法,錯誤 return true; } };