SlideShare ist ein Scribd-Unternehmen logo
1 von 9
Downloaden Sie, um offline zu lesen
Cards




         原案:komiya
        解答:komiya, uwi
問題概要
●   N枚のカードが表向きに並んでいる。
●   表になっているカードを2枚選んで裏返す。
●   裏になっているカードを1枚選んで裏返し、書かれ
     ている数字の分だけスコアを得る。
●   表になっているカードが1枚しかなければ終了。
●   得られるスコアの期待値を求めよ。

●   N ≦ 20
部分点解法
●   “ターン開始時に表になっているカードの集合”を
     状態にとってビットDPする。
●   状態数: 2^n個, 状態毎の計算量: n^3個
●   全体でO(2^n * n^3)
満点解法1
●   方針: ビットDPを高速化する。
●   さっきのやり方では、状態毎のO(n^3)な部分が重
     すぎた。
●   状態数を増やすことによって計算量を落とせる。
満点解法1
●    1. 裏のカードをまだ1枚も選んでない時点
     2. 裏のカードから1枚だけ選んで裏返した時点
     3. 裏のカードを既に2枚とも裏返した時点
●   それぞれの時点について、表になっているカードの
     集合を状態とする。
満点解法1
●   こうやって状態を増やすと、各状態間の遷移が
     O(n)個しかない。
●   状態数: 3 * 2^n 個、状態毎の計算量: O(n)
     なので、全体の計算量はO(2^n * n)まで落ちる。
●   なお、O(2^n * n^2)でも通る模様。
満点解法2
●   期待値といえば? 
      → 線形性!!
●   求めるものは
         E[ Σ(iターン目に得られるスコア) ]
         = Σ E[(iターン目に得られるスコア)]
満点解法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] = (カードの数の平均値)
満点解法2
●   以上をまとめると、
       E[ Σ(iターン目に得られるスコア) ]
         = Σ E[(iターン目に得られるスコア)]
         = Σ (カードの数の平均値)
         = (カードの数の平均値) * (n – 1)

●   平均値を求めるだけでよいので、線形時間!
●   ビットDPより実装も簡単!

Weitere ähnliche Inhalte

Mehr von tomerun

Ninja of Train
Ninja of TrainNinja of Train
Ninja of Traintomerun
 
Vinculum
VinculumVinculum
Vinculumtomerun
 
Together
TogetherTogether
Togethertomerun
 

Mehr von tomerun (6)

Ninja of Train
Ninja of TrainNinja of Train
Ninja of Train
 
Pyramid
PyramidPyramid
Pyramid
 
Vinculum
VinculumVinculum
Vinculum
 
Together
TogetherTogether
Together
 
Cheat
CheatCheat
Cheat
 
Contest
ContestContest
Contest
 

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より実装も簡単!