标签:
http://poj.org/problem?id=3744
有个人要到一个叫“mine road”的地方,路线是一条直线,起点在1,路上有N个地雷,坐标在[1, 100000000]之间,这人每次有p(0.25≤p≤0.75)的概率向前走一步,且有1-p的概率向前走两步,问这货安全通过雷区到达"mine road"的概率
利用特征方程求出通项表达式,要走过有雷的地方f(n+1)=f(n-1)*(1-p). PS:也可以用矩阵快速幂做
/*代码略丑 勿喷*/
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int N=15;
double pow3(double a,long long b)
{
if(b==0)return 0;
double r=1,base=a;
while(b!=0)
{
if(b&1)
r*=base;
base*=base;
b>>=1;
}
return r;
}
long long a[N],now;
int main()
{
int n;
double res,a1,a2,r1,r2,c1,c2,p;
while(~scanf("%d%lf",&n,&p))
{
r1=p/2.0-sqrt(1.0-p+p*p/4);
r2=p/2.0+sqrt(1.0-p+p*p/4);
for(int i=0;i<n;++i)
scanf("%lld",&a[i]);
sort(a,a+n);
now=1,res=1.0;
for(int i=0;i<n;++i)
{
a1=res,a2=res*p;
c2=(a1*r1-a2)/(r1*r2-r2*r2);
c1=(a1-c2*r2)/r1;
res=(c1*pow3(r1,a[i]-now)+c2*pow3(r2,a[i]-now));
res*=(1-p);
now=a[i]+1;
}
printf("%.7f\n",res);
}
}
POJ 3744:Scout YYF I 概率DP+特征方程+快速幂
标签:
原文地址:http://www.cnblogs.com/kiuhghcsc/p/5550659.html