競技プログラミング用 知識集積所
J - Sushi
最終更新:
sport_programming
-
view
問題
必要知識
ABCのB以下レベルの内容は省略
考え方
期待値(未作成)の計算に慣れていれば、発想自体はそこまで難しくない。
期待値 = 1 + 3個の皿を選ぶ確率 * 3個の皿から1つ取った後の期待値 + 2個の皿を選ぶ確率 * 2個の皿から1つ取った後の期待値 + 1個の皿を選ぶ確率 * 1個の皿から1つ取った後の期待値 + 0個の皿を選ぶ確率 * 0個の皿から1つ取った後の期待値
という式で、最後の「0枚の皿から1つ取った後の期待値」は求めたい期待値と同じものである。
自分を含めた再帰計算はできないので、これを以下のように変形する。
自分を含めた再帰計算はできないので、これを以下のように変形する。
(1 - 0個の皿を選ぶ確率) * 期待値 = 1 + 3個の皿を選ぶ確率 * 3個の皿から1つ取った後の期待値 + 2個の皿を選ぶ確率 * 2個の皿から1つ取った後の期待値 + 1個の皿を選ぶ確率 * 1個の皿から1つ取った後の期待値
できるだけ小数計算をしたくないので、両辺に全皿枚数を掛けて
(n - 0個の皿の枚数) * 期待値 = n + 3枚の皿の個数 * 3個の皿から1つ取った後の期待値 + 2枚の皿の個数 * 2個の皿から1つ取った後の期待値 + 1枚の皿の個数 * 1個の皿から1つ取った後の期待値
最初の括弧の中は1個以上の皿の枚数である。
したがって、全部0個の場合を例外処理で取り除いておけば、割り算が可能で、期待値が求まる。
したがって、全部0個の場合を例外処理で取り除いておけば、割り算が可能で、期待値が求まる。
解答例
注意点
寿司が1つ減った時の参照先に注意
寿司が3個乗っている皿が選ばれたときに、参照する先は「3個の皿が1つ減ったデータ」ではない。
3個の皿から寿司を1つ食べるということは、2個の皿が新しくできるということ。
つまり、参照先は「3個の皿が1つ減り、2個の皿が1つ増えたデータ」である。
3個の皿から寿司を1つ食べるということは、2個の皿が新しくできるということ。
つまり、参照先は「3個の皿が1つ減り、2個の皿が1つ増えたデータ」である。
寿司が3個乗っている皿が選ばれたときも同様。
その影響で、2個の皿や1個の皿の枚数が初期値より増える可能性があり、DPテーブルの広さにも注意が必要。