博弈論 取石子(反 Nim 博弈)

2021-10-24 09:43:30 字數 1215 閱讀 4316

alice與bob在一起玩乙個遊戲。現在有乙個字串s,每個人可以選擇字串中的某乙個區間和一種字元,刪除這個區間內的所有該字元(需要刪除字元的數量至少為1)。從alice開始,alice與bob輪流進行進行這個操作,若在某個玩家刪除前,字串已經為空,則該玩家獲勝。

假設alice和bob都會按照其最優的解法刪除,alice想知道,她是否可以獲勝。

1 ≤l

en(s

)≤

100000

1\le len(s) \le 100000

1≤len(

s)≤1

0000

0 字串中的字元均為小寫字母。

樣例1:

輸入:s=「ab」

輸出:true

解釋:1.alice選擇刪除s[0:1]中的』b』 ==> 「a」.

2.bob選擇刪除s[0:0]中的』a』 ==> 「」.

3.字串為空,因此alice獲得勝利.

樣例2:

輸入:s=「aabb」

輸出:false

解釋:無論alice如何進行選擇均無法獲勝

樣例3:

輸入:s=「acacbcbc」

輸出:true

解釋:alice只需要在第一步中刪除s[1:7]中的所有』c』 ==> 「aabb」

即可保證必勝。

這個題實際就是取石子問題,有 n

nn 堆石子,兩個人輪流從其中某一堆中取走至少乙個石子,最後不能取的為贏家,每次只能從一堆中取,可以取完這堆,但不能不取。

這裡注意是取走最後乙個石子的人必輸。

這種博弈被稱為反nim博弈,先手必勝的情況有兩種,只要是這兩種情況之一就為先手必勝,

一:各堆石子數目異或結果不為零,且至少有一堆石子數目大於1

二:各堆石子數目異或結果為零,且所有堆石子數目均為1;

class

solution

bool allisone =

true

;int x =0;

for(

auto

&it : mp)

}return x &&

!allisone ||

!x && allisone;}}

;

取石子 博弈論 Nim遊戲

題目大意 有n堆石子,第i堆有ai個。每次可以選擇乙個x,選擇乙個質數p滿足p x,選擇乙個0 y a x 然後將y個石子從x移動到x p。問先手有多少種第一步移動的測率能夠必勝?答案除以總方案數輸出。n 106,0 ai 109n 10 6,0 ai 10 9題解 從最簡單的情況推導,什麼情況下是...

博弈論 Nim博弈 反Nim博弈 SG函式

nim遊戲 hdu1846 若各堆石子異或和為不為零,則先手勝 後手當且僅當異或和為零時取勝 此題問要想先手取勝第一步的取法,考慮到上述引理,只需遍歷一遍石子找到異或和的最高位匹配的個數。int a 105 int main return0 view code hdu 1848 在上題的基礎上取法只...

博弈論 Nim博弈

1.nim博弈的起源很早,至於歷史我們就不再說了,直接說它的使用場景。1 依舊是兩個人博弈,但是物品時n堆,每一堆有ai個。2 每個人可以挑選一堆取走若干個,但是不能不取。3 最先取完所有物品的人獲勝。4 結論 所以堆的物品的數量異或起來是0,先手必敗。2.乙個nim博弈的例項 nim博弈。乍一看這...