要点:
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 }