leetcode486. 预测赢家(动态规划)
給定一個(gè)表示分?jǐn)?shù)的非負(fù)整數(shù)數(shù)組。 玩家1從數(shù)組任意一端拿取一個(gè)分?jǐn)?shù),隨后玩家2繼續(xù)從剩余數(shù)組任意一端拿取分?jǐn)?shù),然后玩家1拿,……。每次一個(gè)玩家只能拿取一個(gè)分?jǐn)?shù),分?jǐn)?shù)被拿取之后不再可取。直到?jīng)]有剩余分?jǐn)?shù)可取時(shí)游戲結(jié)束。最終獲得分?jǐn)?shù)總和最多的玩家獲勝。
給定一個(gè)表示分?jǐn)?shù)的數(shù)組,預(yù)測玩家1是否會(huì)成為贏家。你可以假設(shè)每個(gè)玩家的玩法都會(huì)使他的分?jǐn)?shù)最大化。
示例 1:
輸入: [1, 5, 2]
輸出: False
解釋: 一開始,玩家1可以從1和2中進(jìn)行選擇。
如果他選擇2(或者1),那么玩家2可以從1(或者2)和5中進(jìn)行選擇。如果玩家2選擇了5,那么玩家1則只剩下1(或者2)可選。
所以,玩家1的最終分?jǐn)?shù)為 1 + 2 = 3,而玩家2為 5。
因此,玩家1永遠(yuǎn)不會(huì)成為贏家,返回 False。
解題思路
數(shù)組含義:dp[i][j]數(shù)組nums(i,j)的先手分?jǐn)?shù)和后手分?jǐn)?shù)的最大差
狀態(tài)轉(zhuǎn)移:dp[i][j]= Math.max(nums[i]-dp[i+1][j],nums[j]-dp[i][j-1])
兩種轉(zhuǎn)移狀態(tài)1.先手從左邊拿2.先手從右邊拿
代碼
class Solution {public boolean PredictTheWinner(int[] nums) {int n=nums.length;int[][] dp=new int[n][n];for(int i=n-2;i>=0;i--)for(int j=i+1;j<n;j++)dp[i][j]= Math.max(nums[i]-dp[i+1][j],nums[j]-dp[i][j-1]);return dp[0][n-1]>=0;} }總結(jié)
以上是生活随笔為你收集整理的leetcode486. 预测赢家(动态规划)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到很多蚕是什么意思
- 下一篇: leetcode312. 戳气球(动态规