後有詳細解答步驟
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 遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。亞歷克斯和李輪流進行,亞歷克斯先開始。每回合,玩家從行的開始或結束處取走整堆石頭。這種情況一直持續到沒有更多的石子堆為止,此時手中石子最多的玩家獲...