POJ 3744 Scout YYF I(概率DP+数学)

来源:互联网 发布:编程语言趋势 编辑:程序博客网 时间:2024/05/29 04:48

不考虑地雷,设f[i]为在i位置上的概率。有f[i] = p * f[i-1] + (1 - p) * f[i-2]。

考虑地雷的话分段算就好了,然而这个问题的关键在于怎么求这个f[i]。


开始看见这个用的矩阵快速幂,,,结果T了【话说别人也有这样做没T的,但看了半天不知道怎么优化

所以就打算求f[i]通项【就是靠数学咯

算出来f[n] = f[1] * (1 - (p - 1)^n) / (2 - p)。

然后再用快速幂就过了!!而且是0ms!!!


代码:

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn = 15;int a[maxn],n;double p;double mod_pow(double a,int k){    double res = 1;    while(k){        if(k & 1) res = res * a;        a *= a;        k >>= 1;    }    return res;}int main(){    while(~scanf("%d%lf",&n,&p)){        for(int i=0;i<n;i++) scanf("%d",&a[i]);        sort(a,a+n);        if(a[0] == 1){            printf("%.7f\n",0);            continue;        }        int k;        double f = 1;        for(int i=0;i<n;i++){            if(i == 0) k = a[i] - 1;            else k = a[i] - a[i-1] - 1;            f = f * (1 - mod_pow(p-1,k)) / (2 - p);            f = f * (1 - p);        }        printf("%.7f\n",f);    }    return 0;}


0 0