競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 266E

ABC266E

期待値DP. 素直に考えると再帰になる. 再帰で考えた後に,高速化として for などが可能か考えればよい. 最初から綺麗に書こうとしない方が楽.

残り \(x\) ターンのときの答えを \(f(x)\) とおく.
\(f(x) = \sum_{d \in [1,6]} \frac{1}{6} max(d, f(x-1))\)
\(f(0) = 0\)
となる. ここで,\(f(0)\) はサイコロの任意の目より小さければ何でもよい. \(max(d, f(0))\) の部分で \(d\) が採用されれば何でも良いから.
または,\(f(0)\) を考えるのが心配なら \(f(1) = 7/2\) を直接求めて使っても良い.

注意
再帰の場合はメモ化しないと TLE.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll n; cin >> n;

  double dp = 0.0;
  rep1(i,n) {
    double old = 0.0;
    swap(dp, old);
    rep1(j,6){
      dp += max((double)j, old);
    }
    dp /= 6.0;
  }
  printf("%.10lf", dp);

  return 0;
}