Cards
- 1. Cards
原案:komiya
解答:komiya, uwi
- 2. 問題概要
● N枚のカードが表向きに並んでいる。
● 表になっているカードを2枚選んで裏返す。
● 裏になっているカードを1枚選んで裏返し、書かれ
ている数字の分だけスコアを得る。
● 表になっているカードが1枚しかなければ終了。
● 得られるスコアの期待値を求めよ。
● N ≦ 20
- 3. 部分点解法
● “ターン開始時に表になっているカードの集合”を
状態にとってビットDPする。
● 状態数: 2^n個, 状態毎の計算量: n^3個
● 全体でO(2^n * n^3)
- 4. 満点解法1
● 方針: ビットDPを高速化する。
● さっきのやり方では、状態毎のO(n^3)な部分が重
すぎた。
● 状態数を増やすことによって計算量を落とせる。
- 5. 満点解法1
● 1. 裏のカードをまだ1枚も選んでない時点
2. 裏のカードから1枚だけ選んで裏返した時点
3. 裏のカードを既に2枚とも裏返した時点
● それぞれの時点について、表になっているカードの
集合を状態とする。
- 6. 満点解法1
● こうやって状態を増やすと、各状態間の遷移が
O(n)個しかない。
● 状態数: 3 * 2^n 個、状態毎の計算量: O(n)
なので、全体の計算量はO(2^n * n)まで落ちる。
● なお、O(2^n * n^2)でも通る模様。
- 7. 満点解法2
● 期待値といえば?
→ 線形性!!
● 求めるものは
E[ Σ(iターン目に得られるスコア) ]
= Σ E[(iターン目に得られるスコア)]
- 8. 満点解法2
● E[ (iターン目に得られるスコア) ] を求めたい。
● iターン目にj枚目のカードを表にひっくり返す確率
を p[i, j]とする。
● 確率の対称性より、 p[i, j] = 1 / n
● したがって、
E[ (iターン目に得られるスコア) ]
= Σ p[i, j] * X[j]
= Σ 1/n * X[j]
= 1/n * Σ X[j] = (カードの数の平均値)
- 9. 満点解法2
● 以上をまとめると、
E[ Σ(iターン目に得られるスコア) ]
= Σ E[(iターン目に得られるスコア)]
= Σ (カードの数の平均値)
= (カードの数の平均値) * (n – 1)
● 平均値を求めるだけでよいので、線形時間!
● ビットDPより実装も簡単!