POJ3744(概率dp)

思路:一长段概率乘过去最后会趋于平稳,所以因为地雷只有10个,可以疯狂压缩其位置,这样就不需要矩阵乘优化了。另外初始化f[0] = 0, f[1] = 1,相当于从1开始走吧。

1 for (int i = 1; i <= n; i++) {
2     if (pos[i] - pos[i - 1] > 50) {
3         for (int j = n; j >= i; j--)
4             pos[j] -= (pos[i] - pos[i - 1] - 50);
5     }
6 }

这段代码j要倒着写否则先从i开始的话pos[i] - pos[i-1]就变了,我tm居然WA了一板一上午……请叫我绝世大傻逼。

 非矩阵版:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 typedef double db;
 8 
 9 const int maxn = 1e3 + 5;
10 int n, pos[20];
11 db f[maxn];
12 db p;
13 
14 db solve() {
15     memset(f, 0, sizeof f);
16     f[1] = 1.0;
17     int t = 1;
18     for (int i = 1; i <= pos[n]; i++) {
19         if (i == pos[t])    f[i] = 0, t++;
20         f[i + 1] += p * f[i];
21         f[i + 2] += (1.0 - p) * f[i];
22     }
23     return f[pos[n] + 1];
24 }
25 
26 int main() {
27     while (scanf("%d%lf", &n, &p) != EOF) {
28         for (int i = 1; i <= n; i++)    scanf("%d", &pos[i]);
29         sort(pos + 1, pos + 1 + n);
30         for (int i = 1; i <= n; i++) {
31             if (pos[i] - pos[i - 1] > 50) {
32                 for (int j = n; j >= i; j--)
33                     pos[j] -= (pos[i] - pos[i - 1] - 50);
34             }
35         }
36         printf("%.7f\n", solve());
37     }
38     return 0;
39 }

猜你喜欢

转载自www.cnblogs.com/AlphaWA/p/10529301.html