Leetcode 1690 石子遊戲

2021-10-12 07:21:02 字數 1133 閱讀 8985

後有詳細解答步驟
class

solution

//從第i個到第j個兩者最大的差值

int[

]dp=

newint

[n][n];/*

dp[x][x]=0;

dp[x-1][x-1]=0;

dp[x-1][x]=min(stones[x-1],stones[x]);

dp[x-2][x]=max(sum[x-1,x]-dp[x-1][x],sum[x-2,x-1]-dp[x-2][x-1]);

*/for(

int st=n-

2;st>=

0;st--)}

return dp[0]

[n-1];

}}

觀察到這題無法用貪心完成,需要用動態規劃
我們首先先明確一點,先取的一定比後取的拿的多

最終需要返回的是第0到第n-1個的石子時候,二者的最大差值

我們將其前進一步

很容易發現就兩種轉換方式

要麼取左邊,要麼取右邊

取左邊的價值是獲得第1到第n-1個石子的總和

代價是減少(從1到第n-1個石子時,二者的最大差值)

取右邊的價值是獲得第0到第n-2個石子的總和

取右邊的代價是減少(從第0到第n-2個石子時,二者的最大差值)

寫成公式就是

dp[0][n-1]=max(sum[1,n-1]-dp[1][n-1],sum[0,n-2]-dp[0][n-2]);

很容易發現我們的公式是從外向內轉移的

也就是我們為了獲取最終dp[0,n-1],

我們必須先獲取內部的dp[1][n-1]與dp[0][n-2],

也就是我們的轉移順序是從內而外

即先算出內部,再慢慢向外部轉移

我們觀察到

當起始點和終止點重合時:dp[x][x]=0;

而當起始點和終止點相差為1時,dp[x-1][x]=min(stones[x-1],stones[x]);

仍滿足轉移方程,並且dp[x][x]的值為int陣列初值,我們不必提前賦值

LeetCode877 石子遊戲

亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子 piles i 遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。亞歷克斯和李輪流進行,亞歷克斯先開始。每回合,玩家從行的開始或結束處取走整堆石頭。這種情況一直持續到沒有更多的石子堆為止,此時手中石子最多的玩家...

LeetCode 877 石子遊戲

usr bin python3 coding utf 8 time 2019 3 16 author xfli the file.這是乙個數學問題,要注意的有兩點,第一,有偶數堆,第二,總數為奇數,不存在平局。所以這樣想,如果有2堆,亞歷克斯選乙個多的,肯定贏了,如果有4堆,平分兩堆,亞歷克斯每兩堆...

LeetCode 877 石子遊戲

亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子piles i 遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。亞歷克斯和李輪流進行,亞歷克斯先開始。每回合,玩家從行的開始或結束處取走整堆石頭。這種情況一直持續到沒有更多的石子堆為止,此時手中石子最多的玩家獲...