[poj 3744]Scout YYF I

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[poj 3744]Scout YYF I相关的知识,希望对你有一定的参考价值。

题目大意:

YYF在一条有地雷的路上行走,每次有p的概率走一步,否则走两步。求安全到达终点概率。

 

又是概率题,来分(luan)析(gao)一下:

题目所求为安全到达终点概率,那么肯定要分为几个部分(否则就纯粹是道司波题嘛)。

以每个地雷为分界点进行递推得出安全通过每一段的概率,相乘即可。

方程:\\({f_i} = {f_{i - 1}} \\times p + {f_{i - 2}} \\times (1 - p)\\)

我们知道直接算显然过慢,于是上一波矩阵快速幂。

列出矩阵:

\\(\\left( {\\begin{array}{*{20}{c}}
{{f_x}}\\\\
{{f_{x - 1}}}
\\end{array}} \\right) = \\left( {\\begin{array}{*{20}{c}}
p&{1 - p}\\\\
1&0
\\end{array}} \\right)\\left( {\\begin{array}{*{20}{c}}
{{f_{x - 1}}}\\\\
{{f_{x - 2}}}
\\end{array}} \\right)\\)

Well Done.

 

代码如下:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cmath>
 5 using namespace std;
 6 struct matrix
 7 {
 8     double val[2][2];
 9     matrix(){}
10     matrix(double a00,double a01,double a10,double a11)
11     {
12         val[0][0] = a00;
13         val[0][1] = a01;
14         val[1][0] = a10;
15         val[1][1] = a11;
16     }
17     matrix(const matrix &oth) {memcpy(val,oth.val,sizeof(val));}
18     inline friend matrix operator*(const matrix &a,const matrix &b)
19     {
20         return matrix(
21             a.val[0][0] * b.val[0][0] + a.val[0][1] * b.val[1][0],
22             a.val[0][0] * b.val[0][1] + a.val[0][1] * b.val[1][1],
23             a.val[1][0] * b.val[0][0] + a.val[1][1] * b.val[1][0],
24             a.val[1][0] * b.val[0][1] + a.val[1][1] * b.val[1][1]
25         );
26     }
27 };//矩阵结构体,有构造和乘运算符。
28 inline matrix pow(matrix a,int p)
29 {
30     matrix ret(1,0,0,1);
31     while(p)
32     {
33         if(p & 1) ret = ret * a;
34         a = a * a;
35         p >>= 1;
36     }
37     return ret;
38 }//矩阵快速幂
39 int n,a[20];
40 double p,ans;
41 int main()
42 {
43     while(~scanf("%d%lf",&n,&p))
44     {
45         matrix transmtx(p,1 - p,1,0);ans = 1;
46         for(int i = 0;i < n;i++)scanf("%d",&a[i]);
47         sort(a,a + n);
48         for(int i = 0;i < n;i++)
49         {
50             if(i != 0 && a[i] == a[i - 1]) continue;
51             matrix res = pow(transmtx,i == 0 ? a[i] - 1 : a[i] - a[i - 1] - 1);//快速幂搞递推了
52             ans *= (1 - res.val[0][0]);//累积概率
53         }
54         printf("%.7f\\n",ans);
55     }
56     return 0;
57 }

话说输出我之前用了lf,调了2小时,淦。

技术分享










以上是关于[poj 3744]Scout YYF I的主要内容,如果未能解决你的问题,请参考以下文章

POJ3744Scout YYF I

POJ 3744 Scout YYF I

POJ 3744 Scout YYF I:概率dp

POJ3744 Scout YYF I (矩阵优化的概率DP)

[poj 3744]Scout YYF I

poj 3744 Scout (Another) YYF I - 概率与期望 - 动态规划 - 矩阵快速幂