競技プログラミング練習会
2019 Normal
担当:zeke
第17回:ゲーム理論、期待値など
自己紹介
zeke
京都大学工学部工業化学科B1
AtCoder:緑
競プロではC++を使っています
みんげーとかWebserviceとか
最近、自転車を買いました
今年からの初心者なのでお手柔らかにお願いします

今日の内容
今日の内容
-
Grundy数
-
Nim
- ゲームDP
- 期待値etc...
競プロにおけるゲームとは?
- 基本二人
- 両者が「最善を尽くす」
- その結果を求める
- 所謂「ナッシュ均衡」(なんも知らんけど…)
- AtCoderによく出てくるイメージ
解き方のアプローチがいっぱい!!!
ゲーム問題の基本構想
Title Text
- Bullet One
- Bullet Two
- Bullet Three
Grundy数
Grundy数の話をする前に
- 有名な石取りゲームを考えてみる
石取りゲーム
- 二人のプレイヤーが、与えられた石の山から1~3個の石を取り合う
- 石が取れなくなったら負け
- 両者とも最善手を取り続けた場合、先手後手どちらが有利?
- 有名な問題で、必勝法がある
- これをGrundy数を用いて考えてみる
Grundy数とは
”ゲームの局面に対して割り当てられる、0 以上の整数”
Grundy数が0の状態を保持したとき必敗である
石取りゲームで考えてみる
| 残された石 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| Grundy数 | 0 | 1 | 2 | 3 | 0 | 1 | 2 | 3 | 0 |
とりあえず
Grundy数が0になる状態を相手に渡せばいい
- Grundyが0以外の時0にすることができる
- Grundyが0の時どう頑張っても相手には0を渡せない
- 帰納的にGrundyが0になる人が負ける
- 考え方としてはゴールから逆算するイメージ?
- 無意識のうちにやっていることが多い
- でも意識してやると、なんとなくコードを書いてWAを生やしてしまうのを防げるかも?
Nim
こんな問題があるらしいです
N山の石を取るゲームををAlice,Bobが行う。このゲームではすべての石の中で最後の石を取った人が勝ちです。(石を取れなくなった人の負け)
各山にはpile[i]個の石が積まれている。プレイヤーは各自分のターンにK個までの山を選択し、各山について石を1つ以上なら何個でも取ることができる。
2人が最適な石の取りかたをする時、Aliceが先攻ならば勝つことができるか?
制約: 1≤N≤ , 1≤pile[i]≤
10^5
10^9
ゲームDP
ゲームDP
- DPの一つ
- 先ほど説明した、Grindy数と似ていて勝ち負け状態を遷移させることが多いらしい(勝ち負け状態をboolで保持)
- もちろん、数値として保存することもある
- どちらにせよ、ゲームのある状態を保存するのは同じ
- メモ化再帰とか区間DPとか、やり方たくさん
N 個の正整数 a1,a2,…,aNが与えられます。
K 個の石が山になっていて、先手と後手が交互に
山から a1,a2,…,aN のいずれかの個数の石をとる
を繰り返します。ただし、山に残っている石の個数より多くの個数の石をとることはできません。先に山から石がとれなくなった方の負け (最後の石をとった方が勝ち) です。先手と後手がお互いに最善を尽くしたとき、勝つのはどちらでしょう?
考察
- 状態(あと何個石が残っているかで)勝ち負け状態を定義することが可能
- dp[i]:石が残りi個で勝ちかどうかをboolで保持
- dp[0]はfalse(確実に負け)
考察(続き)
- 確実に負けに遷移するのが勝ちの状態
- 後ろから見たら終わり
- 計算量はO(NK)
応用:後退解析
Text
その他のゲーム問題
バリエーション豊か
- 偶奇を使う問題
- 相手の行動をパクると勝つ
- ミニマックス法(片方が大きく、片方が小さくするようにする)
偶奇を使う問題はABCのC,Dでときどき見かけた
気づいたらO(1)で解けることが多い
先ほど説明した方法から考察することもできる
コンテスト
Copy of deck
By zeke8080
Copy of deck
- 131