题目链接:https://cn.vjudge.net/contest/276241#problem/A

题目大意:首先输入n和p,n代表地雷的个数,p代表走一步的概率,1-p代表走两步的概率,然后问你这个人安全走出雷区的概率

具体思路:我们可以很容易的推出递式,dp[i] = dp[i-1]*p+dp[i-1]*(1-p).但是这样线性过去的话,肯定会超时,所以我们可以借助矩阵加速,假设输入的地雷个数是n个,sto[1],sto[2],sto[3]...我们把1-sto[1]看成一段,sto[1]+1~sto[2]看成一段,这样一直循环下去就可以了,最终计算结果的时候,我们把每一段的概率相乘就可以了。相乘的时候注意,当前的a[1][1]这个矩阵代表的是正好走到这个雷点的概率,但是我们需要计算的是跳过这个雷点的概率,所以这一段的概率应该是(1-a[1][1])。每一段的第一个概率都是1,因为一定需要从这个点出发。

AC代码:

 #include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
# define ll long long
const int maxn =+;
int sto[maxn];
struct Matrix
{
double a[][];
} tmp;
Matrix cal(Matrix t1,Matrix t2){
Matrix t;
for(int i=; i<=; i++)
{
for(int j=; j<=; j++)
{
t.a[i][j]=;
for(int k=; k<=; k++)
{
t.a[i][j]+=t1.a[i][k]*t2.a[k][j];
}
}
}
return t;
}
Matrix quickpow(Matrix t,int ti)
{
Matrix tt;
if(ti==)//如果有连着的两个雷,这个时候逃出去的概率是0,因为我们计算的时候是取第一个,然后这个时候ans就变成0了,
{
tt.a[][]=;
}
else
{
tt=t;
ti--;
while(ti)
{
if(ti&)
tt=cal(tt,t);
t=cal(t,t);
ti>>=;
}
}
return tt;
}
int main()
{
int n;
double p;
while(~scanf("%d %lf",&n,&p))
{
for(int i=; i<=n; i++)
{
scanf("%d",&sto[i]);
}
sort(sto+,sto+n+);
double ans=;
tmp.a[][]=p;
tmp.a[][]=;
tmp.a[][]=-p;
tmp.a[][]=;
Matrix t;
t=quickpow(tmp,sto[]-);
ans=ans*(-t.a[][]);
for(int i=; i<=n; i++)
{
t=quickpow(tmp,sto[i]-(sto[i-]+));
ans=ans*(-t.a[][]);
}
printf("%.7lf\n",ans);
}
return ;
}

概率dp(A - Scout YYF I POJ - 3744 )的更多相关文章

  1. Scout YYF I POJ - 3744(概率dp)

    Description YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into th ...

  2. Scout YYF I POJ - 3744(概率dp + 矩阵快速幂)

    题意: 一条路上有n个地雷,你从1开始走,单位时间内有p的概率走一步,1-p的概率走两步,问安全通过这条路的概率 解析: 很容易想到 dp[i] = p * dp[i-1] + (1 - p) * d ...

  3. Scout YYF I POJ - 3744【矩阵乘法优化求概率】

    题意: 一条路上有 $n$ 个地雷,YYF 从位置 $1$ 出发,走一步的概率为 $p$,走两步的概率是 $(1-p)$.求 YYF 能顺利通过这条路的概率. 数据范围: $1\leq n \leq ...

  4. Scout YYF I POJ - 3744(矩阵优化)

    题意:一条路上有n个地雷,给出地雷的位置.某人从起点(位置1)出发,走一步的概率是p,走两步的概率是(1-p),然后问有多少概率走过这个雷区. 思路: 只要走过最后一个地雷就代表走过雷区了. 而每到 ...

  5. [转]概率DP总结 by kuangbin

    概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...

  6. POJ 3744 Scout YYF I 概率dp+矩阵快速幂

    题目链接: http://poj.org/problem?id=3744 Scout YYF I Time Limit: 1000MSMemory Limit: 65536K 问题描述 YYF is ...

  7. poj 3744 Scout YYF I(概率dp,矩阵优化)

    Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5020   Accepted: 1355 Descr ...

  8. poj 3744 Scout YYF 1 (概率DP+矩阵快速幂)

    F - Scout YYF I Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  9. POJ 3744 Scout YYF I

    分段的概率DP+矩阵快速幂                        Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

随机推荐

  1. JAVA每日一旅

    1.关于final关键字 final修饰的成员变量为基本数据类型时,在赋值之后无法改变.当final修饰的成员变量为引用数据类型时,在赋值后其指向地址无法改变,但是对象内容还是可以改变的. final ...

  2. BugPhobia开发篇章:Beta阶段第IV次Scrum Meeting

    0x01 :Scrum Meeting基本摘要 Beta阶段第四次Scrum Meeting 敏捷开发起始时间 2015/12/16 00:00 A.M. 敏捷开发终止时间 2015/12/16 23 ...

  3. Beta任务项录入

    今天PM把任务项整理写入TFS中,明天开始正式开发工作:

  4. 《Linux内核分析》 第一节 计算机是如何工作的

    第一节 计算机是如何工作的 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...

  5. JDBC的编码步骤

    0.前提:拷贝数据库的驱动到构建路径中(classpath) 1.注册驱动 2.获取与数据库的链接 3.创建代表SQL语句的对象 4.执行SQL语句 5.如果是查询语句,需要遍历结果集 6.释放占用的 ...

  6. Android-TabLayout设置内容宽度以及下划线宽度

    默认图: 效果图: 项目中使用到需要像今日头条那种实现顶部横向滑动标题功能,本人项目中使用TabLayout+ViewPager实现,但是,实现后默认的TabLayout间距特别大,并且下划线,文字大 ...

  7. 简单封装DBUtils 和 pymysql 并实现简单的逆向工程生成class 类的py文件

    这里使用的 Python 版本是:Python 3.6.0b2. 涉及的三方库:DBUtils.pymysql 1.ConfigurationParser 通过调用Python内置的 xml.dom. ...

  8. Python面向对象高级编程:@property--把方法变为属性

    为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: >>> ...

  9. 【大数据】SparkCore学习笔记

    第1章 RDD概述 1.1 什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象.代码中是一个抽象类,它代表一个不可变.可 ...

  10. 【模板】Floyd

    int n; ][MAX_N + ]; void Floyd() { ; k <= n; ++k) { ; i <= n; ++i) { ; j <= n; ++j) { d[i][ ...