AOJ - SNAIL

$dp[i][j]=$ $i$ 번째 날이고 $j$ 만큼 올라왔을 때 $m$ 일까지 갔을 때 $n$ 이상일 확률

이라고 할 때,

$dp[i][j]=0.75 \cdot dp[i+1][j+2] + 0.25 \cdot dp[i+1][j+1]$ 이 된다.

void solve() {  
   int n, m;  
   cin >> n >> m;  
   vector<vector<double>> dp(m + 1, vector<double>(n * 2 + 1, -1));  
   function<double(int, int)> fn = [&](int i, int j) -> double {  
      if (j >= n) return 1;  
      if (i == m) return 0;  
      double &ret = dp[i][j];  
      if (ret > -0.5) return ret;  
  
      return ret = 0.75 * fn(i + 1, j + 2) + 0.25 * fn(i + 1, j + 1);  
   };  
   cout.precision(15);  
   cout << fixed << fn(0, 0) << endl;  
}

Comments