标签:des style blog color io os ar for strong
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5020 | Accepted: 1355 |
Description
Input
Output
Sample Input
1 0.5 2 2 0.5 2 4
Sample Output
0.5000000 0.2500000
具体来说,对于某一段长度为nk的线段k,设a是线段k的开头,b是线段k的结尾,nk=a-b-1,
到达a的概率设为1,到达a+1概率是p,到达a+2的概率就是Pa*(1-p)+Pa+1*p,这样就可以递推了。
由于Pam=Pam-1*p+Pam-2*(1-p),即推的公式都是一样的,可以用矩阵乘法+快速幂来做。
问题的解可以看做Pn1*(1-p)*Pn2*(1-p)*....Pnn*(1-p),因为最后一个陷阱要跳过去才安全。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<vector> 5 #include<algorithm> 6 #include<cmath> 7 #define M(a,b) memset(a,b,sizeof(a)) 8 typedef long long LL; 9 10 using namespace std; 11 12 int n; 13 double p; 14 int num[20]; 15 16 struct matrix 17 { 18 double mat[2][2]; 19 void init() 20 { 21 mat[0][0] = p; 22 mat[0][1] = 1-p; 23 mat[1][0] = 1; 24 mat[1][1] = 0; 25 } 26 }; 27 28 matrix mamul(matrix aa,matrix bb) 29 { 30 matrix c; 31 for(int i = 0;i<2;i++) 32 { 33 for(int j = 0;j<2;j++) 34 { 35 c.mat[i][j] = 0; 36 for(int k = 0;k<2;k++) 37 c.mat[i][j]+=(aa.mat[i][k]*bb.mat[k][j]); 38 } 39 } 40 return c; 41 } 42 43 matrix mul(matrix s, int k) 44 { 45 matrix ans; 46 ans.init(); 47 while(k>=1) 48 { 49 if(k&1) 50 ans = mamul(ans,s); 51 k = k>>1; 52 s = mamul(s,s); 53 } 54 return ans; 55 } 56 57 int main() 58 { 59 while(scanf("%d%lf",&n,&p)==2) 60 { 61 for(int i = 1;i<=n;i++) 62 scanf("%d",&num[i]); 63 sort(num+1,num+n+1); 64 num[0] = 0; 65 if(num[1]==1) {puts("0.0000000"); continue;} 66 matrix ans; 67 ans.init(); 68 double out = 1; 69 matrix tem; 70 tem.mat[0][0] = (1-p)+p*p; 71 tem.mat[0][1] = p; 72 tem.mat[1][0] = p; 73 tem.mat[1][1] = 1; 74 int flag = 0; 75 for(int i = 1;i<=n;i++) 76 { 77 if(num[i]-num[i-1]<2) 78 {puts("0.0000000"); flag = 1; break;} 79 if(num[i]-num[i-1]-2==0) 80 out*=tem.mat[1][1]; 81 else 82 { 83 ans.init(); 84 ans = mul(ans,num[i]-num[i-1]-3); 85 matrix c; 86 for(int i = 0;i<2;i++) 87 { 88 for(int j = 0;j<2;j++) 89 { 90 c.mat[i][j] = 0; 91 for(int k = 0;k<2;k++) 92 c.mat[i][j]+=(ans.mat[i][k]*tem.mat[k][j]); 93 } 94 } 95 //cout<<c.mat[1][1]<<‘!‘<<endl; 96 out*=c.mat[1][1]; 97 } 98 out*=(1-p);//cout<<out<<endl; 99 tem.mat[0][0] = (1-p)+p*p; 100 tem.mat[0][1] = p; 101 tem.mat[1][0] = p; 102 tem.mat[1][1] = 1; 103 } 104 if(!flag) 105 printf("%.7f\n",out); 106 } 107 return 0; 108 }
poj 3744 Scout YYF I(概率dp,矩阵优化)
标签:des style blog color io os ar for strong
原文地址:http://www.cnblogs.com/haohaooo/p/4025360.html