演算法 石子遊戲(區間DP,博弈)

2022-07-03 11:06:11 字數 2520 閱讀 4085

石子遊戲其實就是多人博弈,如何求最優結果。它存在很多變種,比如不同的取石方式,不同的計算輸贏的方式,在這裡做乙個彙總。

亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子 piles[i] 。

遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。

亞歷克斯和李輪流進行,亞歷克斯先開始。 每回合,玩家從行的開始或結束處取走整堆石頭。 這種情況一直持續到沒有更多的石子堆為止,此時手中石子最多的玩家獲勝。

假設亞歷克斯和李都發揮出最佳水平,當亞歷克斯贏得比賽時返回 true ,當李贏得比賽時返回 false 。

leetcode

解題思路:

class solution 

// 先列舉區間長度

for(int len = 2; len <= n; len ++)

}return f[0][n - 1] > 0;

}}

解題思路:

class solution 

public int dfs(int p, int i, int j)

}

亞歷克斯和李繼續他們的石子遊戲。許多堆石子 排成一行,每堆都有正整數顆石子 piles[i]。遊戲以誰手中的石子最多來決出勝負。

亞歷克斯和李輪流進行,亞歷克斯先開始。最初,m = 1。

在每個玩家的回合中,該玩家可以拿走剩下的 前 x 堆的所有石子,其中 1 <= x <= 2m。然後,令 m = max(m, x)。

遊戲一直持續到所有石子都被拿走。

假設亞歷克斯和李都發揮出最佳水平,返回亞歷克斯可以得到的最大數量的石頭。

leetcode

解題思路:採用動態規劃的方法。

class solution  else }}

}// 從0開始,m等於1就是題目要求的先手最優得分

return f[0][1];

}}

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

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

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

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

leetcode

解題思路:

class solution  

}if(f[0] > sum - f[0]) return "alice";

else if(f[0] < sum - f[0]) return "bob";

else return "tie";

}}

解題思路:

class solution 

public int dfs(int s, int cur)

}

alice 和 bob 兩個人輪流玩乙個遊戲,alice 先手。

一開始,有 n 個石子堆在一起。每個人輪流操作,正在操作的玩家可以從石子堆裡拿走 任意 非零 平方數 個石子。

如果石子堆裡沒有石子了,則無法操作的玩家輸掉遊戲。

給你正整數 n ,且已知兩個人都採取最優策略。如果 alice 會贏得比賽,那麼返回 true ,否則返回 false 。

leetcode

解題思路:動態規劃

class solution 

// 從區間小的情況下開始列舉

for(int i = 2; i <= n; i++)

}return f[n];

}}

石子遊戲中,愛麗絲和鮑勃輪流進行自己的回合,愛麗絲先開始 。

有 n 塊石子排成一排。每個玩家的回合中,可以從行中 移除 最左邊的石頭或最右邊的石頭,並獲得與該行中剩餘石頭值之 和 相等的得分。當沒有石頭可移除時,得分較高者獲勝。

鮑勃發現他總是輸掉遊戲(可憐的鮑勃,他總是輸),所以他決定盡力 減小得分的差值 。愛麗絲的目標是最大限度地 擴大得分的差值 。

給你乙個整數陣列 stones ,其中 stones[i] 表示 從左邊開始 的第 i 個石頭的值,如果愛麗絲和鮑勃都 發揮出最佳水平 ,請返回他們 得分的差值 。

leetcode

解題思路:

class solution 

}return f[1][n];

}}

博弈 取石子遊戲

兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。inp...

石子合併 (區間DP

問題描述 在乙個操場上擺放著一行共n堆的石子。現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請編輯計算出將n堆石子合併成一堆的最小得分和將n堆石子合併成一堆的最大得分。輸入檔案 輸入第一行為n n 1000 表示有n堆石子,第二行為n個用空...

石子合併 區間dp

有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。假設dp 1 4 表示將區間1 4的石子合併所花費的代價。dp 1 4 可以劃分為dp 1 1 dp 2...