POJ 3744:Scout YYF I 概率DP+特征方程+快速幂

Scout YYF I

题目链接:

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
",res);
  }
}

  

原文地址:https://www.cnblogs.com/kiuhghcsc/p/5550659.html