-
Scout YYF I
- POJ - 3744
- dp[i]=p∗dp[i−1]+(1−p)∗dp[i−2].在每一段上按照这个公式递推
- 然后转化为在每段区间上求解不踩雷的概率划分依据是1-a[0], a[0]+1-a[1],按照雷区进行划分
- 在每个区间上以在第一个位置个概率为1.0进行递推在a[i]上的之为踩雷的概率所以最终把每一段的1-a[i]相乘就是总的概率
- 注意:memcpy必须数组大小完全一致进行复制,
-
#include<iostream> #include<cstring> #include<stdio.h> #include<algorithm> using namespace std; int n,a[33]; double p,ans; struct node { double f[2][2]; } base; node mul(node a,node b) { node c; for(int i=0; i<2; i++) for(int j=0; j<2; j++) { c.f[i][j]=0; for(int k=0; k<2; k++) c.f[i][j]+=a.f[i][k]*b.f[k][j]; } return c; } node qpow(node x,int b) { node s; memset(s.f,0,sizeof(s.f)); for(int i=0; i<2; i++) s.f[i][i]=1.0; while(b) { if(b&1) s=mul(s,x); x=mul(x,x); b=b>>1; } return s; } int main() { while(scanf("%d %lf",&n,&p)!=EOF) { ans=1.0; for(int i=0; i<n; i++) scanf("%d",&a[i]); sort(a,a+n); double b[2][2]= {{p,1-p},{1,0}}; memcpy(base.f,b,sizeof(b)); node temp=qpow(base,a[0]-1); ans*=(1-temp.f[0][0]); for(int i=1; i<n; i++) { if(a[i]==a[i-1])continue; temp=qpow(base,a[i]-a[i-1]-1); ans*=(1-temp.f[0][0]); } printf("%.7lf\n",ans); } return 0; }
Scout YYF I POJ - 矩阵快速幂+概率DP
最新推荐文章于 2020-05-08 22:38:43 发布