LeetCode 1140. 石子游戏 II(DP)*
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1140. 石子游戏 II(DP)*
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
1. 題目
亞歷克斯和李繼續他們的石子游戲。許多堆石子 排成一行,每堆都有正整數顆石子 piles[i]。游戲以誰手中的石子最多來決出勝負。
亞歷克斯和李輪流進行,亞歷克斯先開始。最初,M = 1。
在每個玩家的回合中,該玩家可以拿走剩下的 前 X 堆的所有石子,其中 1 <= X <= 2M。然后,令 M = max(M, X)。
游戲一直持續到所有石子都被拿走。
假設亞歷克斯和李都發揮出最佳水平,返回亞歷克斯可以得到的最大數量的石頭。
示例: 輸入:piles = [2,7,9,4,4] 輸出:10 解釋: 如果亞歷克斯在開始時拿走一堆石子,李拿走兩堆,接著亞歷克斯也拿走兩堆。 在這種情況下,亞歷克斯可以拿到 2 + 4 + 4 = 10 顆石子。 如果亞歷克斯在開始時拿走兩堆石子,那么李就可以拿走剩下全部三堆石子。 在這種情況下,亞歷克斯可以拿到 2 + 7 = 9 顆石子。 所以我們返回更大的 10。 提示: 1 <= piles.length <= 100 1 <= piles[i] <= 10 ^ 4來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/stone-game-ii
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
class Solution { public:int stoneGameII(vector<int>& piles) {int i, m, x, n = piles.size();vector<int> presum(piles.size()+1, 0);for(i = 1; i <= n; ++i)presum[i] = presum[i-1]+piles[i-1];if(piles.size() <= 2)return piles[n-1];vector<vector<int>> dp(n+1,vector<int>(n+1,0));//dp[i][m] 表示 剩余i堆石頭,M為m時能得到的最多石頭for(i = 0; i <= n; ++i){for(m = i; m <= n; ++m){ // m >= i。可以全部拿走dp[i][m] = presum[n]-presum[n-i];//可以全部拿走}}for(i = 1; i <= n; ++i){for(m = 1; m <= n; ++m){for(x = 1; x <= min(2*m, i); ++x){dp[i][m] = max(dp[i][m], presum[n]-presum[n-i]-dp[i-x][min(n,max(x, m))]);// 倒著遍歷,剩余1個,剩余2個。。。// 剩余 i 堆// presum[n]-presum[n-i] 表示剩余的石子總數// 我假設拿了 前 x 堆,// 那么對手,從剩余的 i-x 堆中,取最多能取的// dp[i-x][min(n,max(x, m))] 個, 總的數量減去對手拿的}}}return dp[n][1];} };68 ms 7.4 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 1140. 石子游戏 II(DP)*的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1686. 石子游戏
- 下一篇: LeetCode 1250. 检查「好数