poj3744 概率dp+矩阵乘法
来源:互联网 发布:顺企网 云狄网络 编辑:程序博客网 时间:2024/04/29 17:17
题目大意
在一条路上有n个地雷,有个SB人按照心情走在这条路上,往前走1步的概率是p,往前走2步的概率是(1-p),求他活着走过这条路的概率。
分析
很容易想到一种dp方程:f[i]=p*f[i-1]+(1-p)*f[i-2];
然而一看范围:[1, 100000000]
怎么可能不超时呢……
然后可以这么想:只要避开了最后一个地雷不就安全了吗?我们把路分成n段,分别是1~地雷1位置,地雷1位置+1~地雷2位置,地雷2位置+1~地雷3位置,每次的目标是避开每段最后那个地雷。
然后我们可以用矩阵快速幂来加速,因为显然:
然后初始值f[1]=1,f[2]=p;所以进行当前这一段长度-1的矩阵乘法后,处在左上角的那个数就是踩到地雷的概率了。
不过这个概率是建立在f[1]=1的基础上的,而对于不是第一段的段,最初的f值不一定是1,不过也没关系,显然那个值就是避开了前一段地雷,活着来到这一段的值啦。所以每次矩阵快速幂后进行ans=ans*(1-mat[0][0]);的操作即可!
如果有不懂的地方看看代码可能就懂了呢。
代码
#include<iostream>#include<cstdio>#include<climits>#include<algorithm>#include<cstring>#include<cmath>#include<vector>using namespace std;int n;double p;int a[12];struct jz{double mat[2][2];};jz mul(jz x,jz y){//矩阵乘法 int i,j,k; jz re; for(i=0;i<2;i++) for(j=0;j<2;j++){ re.mat[i][j]=0; for(k=0;k<2;k++)re.mat[i][j]+=x.mat[i][k]*y.mat[k][j]; } return re;}jz pow(jz aa,int n){//矩阵快速幂 jz ans; memset(ans.mat,0,sizeof(ans.mat)); ans.mat[0][0]=ans.mat[1][1]=1; while(n){ if(n&1){ans=mul(ans,aa);} aa=mul(aa,aa); n>>=1; } return ans;}int main(){ int i; while(scanf("%d%lf",&n,&p)!=EOF){ for(i=1;i<=n;i++)scanf("%d",&a[i]); sort(a+1,a+1+n);double ans=1; jz gg,tmp; gg.mat[0][0]=p;gg.mat[0][1]=1.0-p; gg.mat[1][0]=1.0;gg.mat[1][1]=0; tmp=pow(gg,a[1]-1); ans*=(1-tmp.mat[0][0]); for(i=2;i<=n;i++){ if(a[i-1]==a[i])continue; tmp=pow(gg,a[i]-a[i-1]-1); ans*=(1-tmp.mat[0][0]);//活着离开这一段的概率 } printf("%.7f\n",ans); } return 0;}
阅读全文
0 0
- poj3744 概率dp+矩阵乘法
- poj3744(概率DP+矩阵优化)
- poj3744(概率DP+矩阵二分)
- poj3744之矩阵快速幂+概率DP
- POJ3744(概率dp+矩阵快速幂)
- poj3744 概率dp + 矩阵快速幂
- poj3744(概率DP)
- poj3744 Scout YYF I 概率dp+矩阵快速幂
- poj3744--Scout YYF I(概率dp第五弹:矩阵优化)
- POJ3744 Scout YYF I (概率DP + 矩阵优化)
- 【POJ3744】Scout YYF I-概率DP+矩阵加速优化
- POJ3744:Scout YYF I(概率dp & 矩阵优化)
- POJ3744 Scout YYF I ( 矩阵快速幂 + 期望概率DP )
- poj3744 Scout YYF I 【概率dp+矩阵优化】
- poj3744——Scout YYF I(概率DP+矩阵快速幂)
- POJ3744-Scout YYF I--概率DP
- poj3744(概率dp+快速幂)
- poj3744 概率
- 分享一个Android平台编译脚本1
- 装饰者模式
- 2017湖北荆州松滋家族谱集
- Paint.drawText时候文字尺寸相关的值
- java中内部类总结
- poj3744 概率dp+矩阵乘法
- web.xml 中报错:Start state is missing. Add at least one state to the flow
- WaitForMultipleObject与MsgWaitForMultipleObjects用法
- Git 在 windows 下 的全局代理设置
- DEBUG和RELEASE版本需分别设置附加lib文件
- SVN认证失败及“在其上下文中,该请求地址无效”问题的解决方法
- LINUX设备驱动之设备模型一--kobject
- 链表中LinkList L与LinkList *L的区别
- 数据库和实例