HDU4089(概率dp)

题解

要点:

1.转移方程分三段,这个……有点复杂但是还好吧……大概就是求啥设啥,然后只通过可行的状态过来。在纸上记一记。

2.每层里面必须先求dp[i][i],简直就是我求我自己……用类似进制数那种方式解个方程。

3.居然还有eps特判这事情。果然去掉标准同步以后就不能用puts了,会WA~

 1 const int maxn = 2005;
 2 const db eps = 1e-5;
 3 int n, m, k;
 4 db p1, p2, p3, p4;
 5 db dp[2][maxn];
 6 
 7 int main() {
 8     ios_base::sync_with_stdio(false);
 9     cin.tie(0);
10     while (cin >> n >> m >> k >> p1 >> p2 >> p3 >> p4) {
11         if (p4 < eps) {
12             cout << fixed << setprecision(5) << (db)0 << endl;
13             continue;
14         }
15         init(dp, 0);
16         dp[1&1][1] = p4 / (p3 + p4);
17         rep(i, 2, n) {
18             db sum = 0, pp = 1;
19             irep(j, i, 1) {
20                 if (j == 1)    sum += p4 / (1 - p1) * pp;
21                 else if (1 < j && j <= k)    sum += (p3 * dp[i-1&1][j - 1] + p4) / (1 - p1) * pp;
22                 else    sum += p3 / (1 - p1) * dp[i-1&1][j - 1] * pp;
23                 pp *= p2 / (1 - p1);
24             }
25             dp[i&1][i] = sum / (1 - pp);
26 
27             rep(j, 1, i - 1) {
28                 if (j == 1)    dp[i&1][j] = (p2 * dp[i&1][i] + p4) / (1 - p1);
29                 else if (1 < j && j <= k)    dp[i&1][j] = (p2 * dp[i&1][j - 1] + p3 * dp[i-1&1][j - 1] + p4) / (1 - p1);
30                 else    dp[i&1][j] = (p2 * dp[i&1][j - 1] + p3 * dp[i-1&1][j - 1]) / (1 - p1);
31             }
32         }
33         cout << fixed << setprecision(5) << dp[n&1][m] << endl;
34     }
35     return 0;
36 }

 

posted @ 2019-03-15 21:14  AlphaWA  阅读(174)  评论(0编辑  收藏  举报