POJ3744(概率dp)
Posted alphawa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ", solve()); 37 } 38 return 0; 39 }
以上是关于POJ3744(概率dp)的主要内容,如果未能解决你的问题,请参考以下文章
POJ3744 Scout YYF I (矩阵优化的概率DP)
POJ 3744:Scout YYF I 概率DP+特征方程+快速幂