poj 3744 Scout YYF I (矩阵快速幂 优化 概率dp)
2014-10-29 21:42
459 查看
题目链接
分析&&题意来自 : /article/4680212.html
题意:
在一条不满地雷的路上,你现在的起点在1处。在N个点处布有地雷,1<=N<=10。地雷点的坐标范围:[1,100000000].
每次前进p的概率前进一步,1-p的概率前进1-p步。问顺利通过这条路的概率。就是不要走到有地雷的地方。
分析:
设dp[i]表示到达i点的概率,则 初始值 dp[1]=1.
很容易想到转移方程: dp[i]=p*dp[i-1]+(1-p)*dp[i-2];
但是由于坐标的范围很大,直接这样求是不行的,而且当中的某些点还存在地雷。
N个有地雷的点的坐标为 x[1],x[2],x[3]```````x
.
我们把道路分成N段:
1~x[1];
x[1]+1~x[2];
x[2]+1~x[3];
`
`
`
x[N-1]+1~x
.
这样每一段只有一个地雷。我们只要求得通过每一段的概率。乘法原理相乘就是答案。
对于每一段,通过该段的概率等于1-踩到该段终点的地雷的概率。
就比如第一段 1~x[1]. 通过该段其实就相当于是到达x[1]+1点。那么p[x[1]+1]=1-p[x[1]].
但是这个前提是p[1]=1,即起点的概率等于1.对于后面的段我们也是一样的假设,这样就乘起来就是答案了。
对于每一段的概率的求法可以通过矩阵乘法快速求出来。
---------------------------------------------------------------------------------------------------
我用的矩阵| 0 ,1-P | ,开始的为|1, p|, 乘以这个矩阵x[i] - 1次,就可以得到该点的概率。
| 1 , p |
分析&&题意来自 : /article/4680212.html
题意:
在一条不满地雷的路上,你现在的起点在1处。在N个点处布有地雷,1<=N<=10。地雷点的坐标范围:[1,100000000].
每次前进p的概率前进一步,1-p的概率前进1-p步。问顺利通过这条路的概率。就是不要走到有地雷的地方。
分析:
设dp[i]表示到达i点的概率,则 初始值 dp[1]=1.
很容易想到转移方程: dp[i]=p*dp[i-1]+(1-p)*dp[i-2];
但是由于坐标的范围很大,直接这样求是不行的,而且当中的某些点还存在地雷。
N个有地雷的点的坐标为 x[1],x[2],x[3]```````x
.
我们把道路分成N段:
1~x[1];
x[1]+1~x[2];
x[2]+1~x[3];
`
`
`
x[N-1]+1~x
.
这样每一段只有一个地雷。我们只要求得通过每一段的概率。乘法原理相乘就是答案。
对于每一段,通过该段的概率等于1-踩到该段终点的地雷的概率。
就比如第一段 1~x[1]. 通过该段其实就相当于是到达x[1]+1点。那么p[x[1]+1]=1-p[x[1]].
但是这个前提是p[1]=1,即起点的概率等于1.对于后面的段我们也是一样的假设,这样就乘起来就是答案了。
对于每一段的概率的求法可以通过矩阵乘法快速求出来。
---------------------------------------------------------------------------------------------------
我用的矩阵| 0 ,1-P | ,开始的为|1, p|, 乘以这个矩阵x[i] - 1次,就可以得到该点的概率。
| 1 , p |
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> #include <cmath> #include <algorithm> #define LL __int64 const int maxn = 100+10; using namespace std; struct node { double m[3][3]; }; node mul(node a, node b) //两个矩阵想乘 { int i, j, k; node c; for(i = 0; i < 2; i++) for(j = 0; j < 2; j++) { c.m[i][j] = 0; for(k = 0; k < 2; k++) c.m[i][j] += a.m[i][k]*b.m[k][j]; } return c; } node pow_n(node a, int n) //a矩阵乘n次 { node c; memset(c.m, 0, sizeof(c.m)); for(int i = 0; i < 2; i++) c.m[i][i] = 1; while(n) { if(n%2) c = mul(c, a); a = mul(a, a); n /= 2; } return c; } int main() { int n, i, x[20], pre; double p, ans; while(~scanf("%d%lf", &n, &p)) { node a; ans = 1.0; a.m[0][0] = 0; a.m[0][1] = 1.0-p; a.m[1][0] = 1.0; a.m[1][1] = p; for(i = 0; i < n; i++) scanf("%d", &x[i]); sort(x, x+n); pre = 0; for(i = 0; i < n; i++) { node tmp = pow_n(a, x[i]-pre-1); ans *= (1.0-(1.0*tmp.m[0][0]+p*tmp.m[1][0])); pre = x[i]; } printf("%.7f\n", ans); } return 0; }
相关文章推荐
- POJ 3744 Scout YYF I 详细题解(矩阵优化概率DP)水题
- poj 3744 Scout YYF I(矩阵优化概率DP)
- POJ 3744 Scout YYF I(矩阵优化的概率DP)
- POJ 3744 Scout YYF I (矩阵优化,分段计算的概率DP)
- poj 3744 Scout YYF I(概率dp,矩阵优化)
- POJ 3744 Scout YYF I (矩阵优化的概率DP)
- [概率dp 矩阵乘法] poj 3744 Scout YYF I
- POJ 3711 Scout YYF I 概率DP + 矩阵快速幂
- poj 3744 Scout (Another) YYF I - 概率与期望 - 动态规划 - 矩阵快速幂
- poj 3744 概率dp 矩阵快速幂优化
- POJ 3744 Scout YYF I(矩阵快速幂优化+概率dp)
- POJ3744——概率DP 矩阵快速幂优化——Scout YYF I
- poj 3744 Scout YYF I(矩阵快速幂优化dp)
- POJ 3744 Scout YYF I(概率DP)
- poj 3744 Scout YYF I (概率DP&矩阵快速幂)★
- POJ 3744 Scout YYF I 概率DP + 矩阵快速幂
- POJ 3744 Scout YYF I 概率DP matrix 一开始考虑错误TLE了
- POJ 3744 Scout YYF I(矩阵快速幂 概率dp)
- POJ 3744 Scout YYF I(概率DP+数学)
- POJ 3744 Scout YYF I 概率dp+矩阵快速幂