题目:
题意:
主人公有p的几率走一步,1-p的几率走两步,主人公一开始在格子1,给出地雷的位置,请问安全通过的概率是多少
题解:
概率与期望第一弹,但是这道题体现的基本是矩阵优化思想,那就当是矩阵题做一下
dp[i]表示到第i个格子安全的概率,不难发现:dp[i]=dp[i-1]*p+dp[i-2]*(1-p)
但是这样i太大了,我们不如矩阵优化一下
dp[i] | p ,1-p |n-1 dp[1]
=| | *
dp[i-1] | 1 , 0 | dp[0]
代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
struct hh
{
double cr[3][3];
};
int a[12];
double p;
hh work(hh a,hh b)
{
hh c;
int i,j,k;
memset(c.cr,0,sizeof(c.cr));
for (i=1;i<=2;i++)
for (j=1;j<=2;j++)
for (k=1;k<=2;k++)
c.cr[i][j]=(c.cr[i][j]+a.cr[i][k]*b.cr[k][j]);
return c;
}
double pow(int pp)
{
hh x,ans;
memset(ans.cr,0,sizeof(ans.cr));
x.cr[1][1]=p; x.cr[1][2]=1-p;
x.cr[2][1]=1; x.cr[2][2]=0;
ans.cr[1][1]=1;
ans.cr[2][1]=0;
for (;pp;pp>>=1,x=work(x,x))
if (pp&1) ans=work(ans,x);
return ans.cr[1][1];
}
int main()
{
int n,i;
while (~scanf("%d%lf",&n,&p))
{
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
double rr=1.0;
for (i=1;i<=n;i++)
rr*=(1-pow(a[i]-a[i-1]-1));
printf("%.7f\n",rr);
}
}