leetcode486. 预测赢家(动态规划)
生活随笔
收集整理的這篇文章主要介紹了
leetcode486. 预测赢家(动态规划)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定一個表示分數的非負整數數組。 玩家1從數組任意一端拿取一個分數,隨后玩家2繼續從剩余數組任意一端拿取分數,然后玩家1拿,……。每次一個玩家只能拿取一個分數,分數被拿取之后不再可取。直到沒有剩余分數可取時游戲結束。最終獲得分數總和最多的玩家獲勝。
給定一個表示分數的數組,預測玩家1是否會成為贏家。你可以假設每個玩家的玩法都會使他的分數最大化。
示例 1:
輸入: [1, 5, 2]
輸出: False
解釋: 一開始,玩家1可以從1和2中進行選擇。
如果他選擇2(或者1),那么玩家2可以從1(或者2)和5中進行選擇。如果玩家2選擇了5,那么玩家1則只剩下1(或者2)可選。
所以,玩家1的最終分數為 1 + 2 = 3,而玩家2為 5。
因此,玩家1永遠不會成為贏家,返回 False。
解題思路
數組含義:dp[i][j]數組nums(i,j)的先手分數和后手分數的最大差
狀態轉移:dp[i][j]= Math.max(nums[i]-dp[i+1][j],nums[j]-dp[i][j-1])
兩種轉移狀態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;} }總結
以上是生活随笔為你收集整理的leetcode486. 预测赢家(动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到很多蚕是什么意思
- 下一篇: 梦到家里很多猫是什么意思