标签:des style color io os ar for strong sp
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5062 | Accepted: 1370 |
Description
Input
Output
Sample Input
1 0.5 2 2 0.5 2 4
Sample Output
0.5000000 0.2500000
题意:人人从1开始走,p的概率走1步,1-p的概率走2步,求不踩雷的概率。地雷数N<=10,坐标范围在100000000内。
思路:人走到第i位置的概率为dp[i]=dp[i-1]*p+dp[i-2]*(1-p),由于数据范围较大,可有矩阵快速幂快速求出答案;
构造矩阵 | P , 1 | 即 | dp[n+1] , dp[n] | = | dp[n] , dp[n-1] | * | P , 1 |
| 1-P , 0 | | 1-P , 0 |
然后将每个a[i]+1到a[i+1]看做一段单独处理就行。
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int maxn=100000050; struct node { double mat[2][2]; }A,B,C; double dp[maxn],p; int n,a[15]; void input() { for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); A.mat[0][0]=p,A.mat[0][1]=1.0; A.mat[1][0]=1.0-p,A.mat[1][1]=0.0; } node mul(node p,node q) // 矩阵相乘 { node ans; for(int i=0;i<2;i++) for(int j=0;j<2;j++) { ans.mat[i][j]=0.0; for(int k=0;k<2;k++) ans.mat[i][j]+=p.mat[i][k]*q.mat[k][j]; } return ans; } node pow(node w,int num) // 快速幂 { node ret=B,c=w; int coun=num; while(coun) { if(coun & 1) ret=mul(ret,c); coun>>=1; c=mul(c,c); } return ret; } void solve() { int now=1; double f1=0.0,f2=1.0; for(int i=0;i<n;i++) { if(a[i]-now>=1) { node tmp=pow(A,a[i]-1-now); f2=(f2*tmp.mat[0][0]+f1*tmp.mat[1][0])*(1.0-p); f1=0.0; now=a[i]+1; } else { printf("0.0000000\n"); return ; } } printf("%.7f\n",f2); } int main() { B.mat[0][0]=1.0,B.mat[0][1]=0.0; B.mat[1][0]=0.0,B.mat[1][1]=1.0; while(scanf("%d %lf",&n,&p)!=EOF) { input(); solve(); } return 0; }
poj 3744 Scout YYF I (概率DP+矩阵快速幂)
标签:des style color io os ar for strong sp
原文地址:http://blog.csdn.net/u012596172/article/details/40212517