1406 石子遊戲 III 動態規劃

2021-10-07 18:13:00 字數 1790 閱讀 7929

題目描述:

alice 和 bob 用幾堆石子在做遊戲。幾堆石子排成一行,每堆石子都對應乙個得分,由陣列 stonevalue 給出。

alice 和 bob 輪流取石子,alice 總是先開始。在每個玩家的回合中,該玩家可以拿走剩下石子中的的前 1、2 或 3 堆石子 。比賽一直持續到所有石頭都被拿走。

每個玩家的最終得分為他所拿到的每堆石子的對應得分之和。每個玩家的初始分數都是 0 。比賽的目標是決出最高分,得分最高的選手將會贏得比賽,比賽也可能會出現平局。

假設 alice 和 bob 都採取 最優策略 。如果 alice 贏了就返回 「alice」 ,bob 贏了就返回 「bob」,平局(分數相同)返回 「tie」 。

示例 1:

輸入:values = [1,2,3,7]

輸出:「bob」

解釋:alice 總是會輸,她的最佳選擇是拿走前三堆,得分變成 6 。但是 bob 的得分為 7,bob 獲勝。

示例 2:

輸入:values = [1,2,3,-9]

輸出:「alice」

解釋:alice 要想獲勝就必須在第乙個回合拿走前三堆石子,給 bob 留下負分。

如果 alice 只拿走第一堆,那麼她的得分為 1,接下來 bob 拿走第

二、三堆,得分為 5 。之後 alice 只能拿到分數 -9 的石子堆,輸掉比賽。

如果 alice 拿走前兩堆,那麼她的得分為 3,接下來 bob 拿走第三堆,得分為 3 。之後 alice 只能拿到分數 -9 的石子堆,同樣會輸掉比賽。

注意,他們都應該採取 最優策略 ,所以在這裡 alice 將選擇能夠使她獲勝的方案。

示例 3:

輸入:values = [1,2,3,6]

輸出:「tie」

解釋:alice 無法贏得比賽。如果她決定選擇前三堆,她可以以平局結束比賽,否則她就會輸。

示例 4:

輸入:values = [1,2,3,-1,-2,-3,7]

輸出:「alice」

示例 5:

1 <= values.length <= 50000

-1000 <= values[i] <= 1000

方法1:

主要思路:

(1)dp[ i ]表示從當前第 i 個元素起,到最後的元素,使用1,或2,或3堆,用 j 表示,可以獲得最優的結果;

(2)sum表示從當前第 i 個元素到最後乙個元素的之和,則在 i 處取完 j 堆之後,則剩下的最優的取法獲得值為 dp[i+j],由於總數不變,故dp[ i ]+dp[ i+j ]=sum,故在 i 處的最優的結果即為三種取法中的最優的結果,既 dp[i]=max(dp[i],sum-dp[i+j]);,j取 1,2,3;

(3)為了便於處理,將dp多申請了三個元素的記憶體,並對後面三個元素賦值為0,減少對前面的影響,其它元素初始化賦值為int_min;

(4)最後根據sum和dp[ 0 ] 的關係,決定返回值。

class

solution}if

(sum-dp[0]

==dp[0]

)return

"tie";if

(sum-dp[0]

>dp[0]

)return

"bob"

;return

"alice";}

};

動態規劃系列 877 石子遊戲

package test 動態規劃系列 877.石子遊戲 亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子 piles i 遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。亞歷克斯和李輪流進行,亞歷克斯先開始。每回合,玩家從行的開始或結束處取走整堆石頭。這種...

動態規劃 5627 石子遊戲VII

思路 用dp i j 表示i到j的區間和,用res i j 表示本次操作後該選手在i與j區間獲得的最大價值差,所以無論是愛麗絲還是鮑勃,在每次操作時都是為了獲得最大價值差,才能保證題意,即愛麗絲無限度擴大差值,鮑勃盡力減小差值。在最初的時候i j,即res i j 0 當j i 1時,為了獲得最大價...

動態規劃2石子合併

題目描述如下 解析 1.因為只能取相鄰然後考慮又是乙個環這又是環上dp 所以我們首先破環成鏈,列舉兩倍n可得所有情況。2.仔細看一下又有點像合併果子,所以我們不難想到區間動規既然是區間動規那麼就考慮先把大區間分成各個小區間然後再將小區間合併,合併考慮將各個小區間的值相加再加上合併的代價,並且列舉分界...