博弈論基礎(chǔ)知識

0X00 一個關(guān)于「異或」的前置知識

假設(shè)有:

x_1 \oplus x_2 \oplus ... \oplus x_n = s (s > 0)

那么一定存在一個 x_k 使 x_k 減去一個大于 0 的數(shù)字得到

x_1 \oplus x_2 \oplus ...\oplus (x_k - a)\oplus ... \oplus x_n = 0(a > 0)

證明過程如下(構(gòu)造法):

假設(shè) s 的最高位是 m波势, 那么 x_1...x_n 中一定有一個 x_k 使得 x_k 的第 m 位一定是 1(反證法橄教,如果所有都不是 1 那么 s 的 m 位一定是 0)。且 x_k \oplus s < x_k载佳。

如果這里不好理解,我再舉個例子

假設(shè) x_k = 11101\ s = 111 x_k \oplus s = 11010 < x_k, 也就是 m 位變成了 0 更高位不變所以一定變小

因此臀栈,只要我們讓 x_k 變成 x_k \oplus s (減少一部分)等式左邊變?yōu)?/p>

x_1 \oplus x_2 \oplus ...\oplus (x_k \oplus s)\oplus ... \oplus x_n = x_1 \oplus x_2 \oplus ... \oplus x_n \oplus s = s \oplus s = 0

證畢

0X01 切一些簡單題

掌握了這么一個前置知識以后,我們用這個前置知識來切題挠乳。

博弈論的題目权薯,我們一般都得分析出來,如何才能夠獲勝睡扬。先看這一道題 Nim游戲

首先分析出「必勝態(tài)」和「必敗態(tài)」游戲的最后一定是有一個人拿走一個石子后盟蚣,就沒有石子了。此時 n 堆石子異或?yàn)?/p>

x_1 \oplus x_2 \oplus ... \oplus x_n = 0

我們現(xiàn)在有 x_1 \oplus x_2 \oplus ... \oplus x_n > 0 就一定能夠讓對方處于 x_1 \oplus x_2 \oplus ... \oplus x_n = 0 這一前置知識卖怜,所以只要當(dāng)前 x_1 \oplus x_2 \oplus ... \oplus x_n > 0 先手必勝屎开!

接著我們來看一道變化的題目:

臺階-Nim游戲

題目描述如下:

現(xiàn)在,有一個級臺階的樓梯马靠,每級臺階上都有若干個石子奄抽,其中第i個石子(i≥1)兩位玩家輪流操作,每次操作可以從任意一級臺階上拿若干個石子放到下一級臺階中(不能不拿)甩鳄。已經(jīng)拿到地面上的石子不能再拿逞度,最后無法進(jìn)行操作的人視為失敗。問如果兩人都采用最優(yōu)策略妙啃,先手是否必勝档泽。

這個題有一個小的變形

  • 勝負(fù)與偶數(shù)臺階無關(guān),因?yàn)槿绻仁忠苿优紨?shù)階的石子到奇數(shù)階揖赴,那么后手一定能夠移動相同的石子到偶數(shù)階馆匿。所以先手必敗

將所有奇數(shù)階的石子異或起來,如果不為 0燥滑。那么先手必勝渐北,原因是先手一定能夠使石子,使異或?yàn)?0突倍。

0X02 sg 函數(shù)

首先我們來描述這樣一個基礎(chǔ)問題:

有 n 個石子腔稀,假設(shè) A、B 可以輪流拿 1 或 2 顆石子羽历,誰最后沒有石子拿誰就輸焊虏。問如果 A 先拿,A 是不是能夠必勝秕磷。

這里我取 n = 5 并畫出 n = 5 時的所有可能行

我們求出每個點(diǎn)的 sg 函數(shù)诵闭,一個節(jié)點(diǎn)的 sg 值是它所有子節(jié)點(diǎn)的 sg 值所不能到達(dá)的最小自然數(shù)。可能很抽象疏尿,我們舉個例子(按照上這張圖寫出每個節(jié)點(diǎn)的 sg 值):

  • 0 誰也不能到達(dá)瘟芝。所以 sg(0) = 0
  • 1 能到達(dá) 0。sg(0) = 1 所以 sg(1) = 1
  • 2 能到達(dá) 1 和 0褥琐。sg(0) = 0 sg(1) = 1所以 sg(2) = 2
  • 3 能到達(dá) 2 和 1锌俱。sg(1) = 1 sg(2) = 2 所以 sg(3) = 0
  • 4 能到達(dá) 2 和 3。sg(2) = 2 sg(3) = 0 所以 sg(4) = 1
  • 5 能到達(dá) 4 和 3敌呈。sg(3) = 0 sg(4) = 1 所以 sg(5) = 2

下面給出這道題的結(jié)論贸宏,只要是 sg(i) = 0 那么此節(jié)點(diǎn)一定是必敗態(tài)。

這里可以用反證法證明:

如果 sg(i) > 0 那么 i 這個節(jié)點(diǎn)一定能轉(zhuǎn)移到 sg 等于 0 上的節(jié)點(diǎn)磕洪。而 sg 等于 0 的點(diǎn)要么可以轉(zhuǎn)移到不為 0 的點(diǎn)(后手還是可以轉(zhuǎn)移到另外一個 sg 不等于 0 的點(diǎn)上去)吭练,要么就是最后輸了的狀態(tài)。

sg 函數(shù)的一些簡單拓展問題

  • n 堆石子和 s 種拿法

集合-Nim游戲

代碼如下:

from sys import stdin

def read():
    return list(map(int, stdin.readline().split()))

def sg(n):
    if f[n] != -1: return f[n]
    t = set()
    for c in cs:
        if c <= n:
            t.add(sg(n-c))
    
    i = 0
    while i in t:
        i += 1
    f[n] = i
    return i

N = 10010
cn, cs = read()[0], read()
n, nums = read()[0], read()
f = [-1] * N

res = 0
for v in nums:
    res ^= sg(v)
if res: print("Yes")
else: print("No")
  • 拆分

拆分-Nim游戲

代碼如下:

from sys import stdin

def read(n = 2):
    if n == 1:
        return int(stdin.readline())
    return map(int, stdin.readline().split())

N = 110
n = read(1)
nums = read()
f = [-1] * N

def sg(x):
    if f[x] != -1: return f[x]
    
    t = set()
    for i in range(x):
        for j in range(i+1):
            t.add(sg(i) ^ sg(j))
    
    i = 0
    while i in t:
        i += 1
    f[x] = i
    
    return i
    
res = 0
for v in nums:
    res ^= sg(v)

if not res:
    print("No")
else:
    print("Yes")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末析显,一起剝皮案震驚了整個濱河市鲫咽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谷异,老刑警劉巖分尸,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晰绎,居然都是意外死亡寓落,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門荞下,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伶选,“玉大人,你說我怎么就攤上這事尖昏⊙鏊埃” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵抽诉,是天一觀的道長陨簇。 經(jīng)常有香客問我,道長迹淌,這世上最難降的妖魔是什么河绽? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮唉窃,結(jié)果婚禮上耙饰,老公的妹妹穿的比我還像新娘。我一直安慰自己纹份,他們只是感情好苟跪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布廷痘。 她就那樣靜靜地躺著,像睡著了一般件已。 火紅的嫁衣襯著肌膚如雪笋额。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天篷扩,我揣著相機(jī)與錄音兄猩,去河邊找鬼。 笑死鉴未,一個胖子當(dāng)著我的面吹牛厦滤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歼狼,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼享怀!你這毒婦竟也來了羽峰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤添瓷,失蹤者是張志新(化名)和其女友劉穎梅屉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳞贷,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坯汤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搀愧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惰聂。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咱筛,靈堂內(nèi)的尸體忽然破棺而出搓幌,到底是詐尸還是另有隱情,我是刑警寧澤迅箩,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布溉愁,位于F島的核電站,受9級特大地震影響饲趋,放射性物質(zhì)發(fā)生泄漏拐揭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一奕塑、第九天 我趴在偏房一處隱蔽的房頂上張望堂污。 院中可真熱鬧,春花似錦爵川、人聲如沸敷鸦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扒披。三九已至值依,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碟案,已是汗流浹背愿险。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留价说,地道東北人辆亏。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像鳖目,于是被迫代替她去往敵國和親扮叨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355