http://poj.org/problem?id=3744

题意:在一条铺满地雷的路上,你现在的起点在1处。在N个点处布有地雷,1<=N<=10。地雷点的坐标范围:[1,100000000].
每次前进p的概率前进一步,1-p的概率前进2步。问顺利通过这条路的概率。就是不要走到有地雷的地方。
 
分析:
安全通过就是走到最右的地雷坐标+1 的位置(安全)
有一道显然的转移方程 dp[i] = dp[i-1]*p + dp[i-2]*(1-p) ;   如果有地雷dp[i] 就为0,这样一直的递推下去可是我们发现地雷的坐标真的太大了,递推超时;然后我们在观察这个式子可以发现这是斐波那契数列,可以想到用矩阵快速幂解决 ,但是如果是出现了地雷,dp[i]就会改变,这样就无法使用快速幂。
N个有地雷的点的坐标为 x[1],x[2],x[3]```````x[N].
我们把道路分成N段:
1~x[1];
x[1]+1~x[2];
x[2]+1~x[3];
`
`
`
x[N-1]+1~x[N].
 
这样每一段只有一个地雷。我们只要求得通过每一段的概率。乘法原理相乘就是答案。
对于每一段,通过该段的概率等于1-踩到该段终点的地雷的概率。
 
就比如第一段 1~x[1].  通过该段其实就相当于是到达x[1]+1点。那么p[x[1]+1]=1-p[x[1]].
但是这个前提是p[1]=1,即起点的概率等于1.对于后面的段我们也是一样的假设,这样就乘起来就是答案了。
 (可以理解为我走到那个位置炸了了,那安全的概率肯定是1-不满足的概率啊)
对于每一段的概率的求法可以通过矩阵乘法快速求出来。
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std; typedef long long ll; typedef vector<double>vec;
typedef vector<vec >mat;
int n;
double p,T1,T2,pT1,pT2;
mat mul(mat &A , mat &B)
{
mat C(A.size(),vec(B.size())); for(int i= ; i<A.size() ; i++)
{
for(int k= ; k<B.size() ; k++)
{
if(A[i][k]==) continue;
for(int j= ; j<B[].size() ; j++)
{
if(B[k][j]==) continue;
C[i][j]=(C[i][j] + A[i][k]*B[k][j]);
}
}
}
return C;
}
mat qpow(mat A,ll n)
{
mat B(A.size(),vec(A.size()));
for(int i= ; i<A.size() ; i++)
B[i][i]=;
while(n>)
{
if(n&)
B=mul(B,A);
A=mul(A,A);
n>>=;
}
return B;
}
double so(int len)
{
mat A(,vec());
A[][]=p;A[][]=-p;
A[][]=;A[][]=;
A = qpow(A,len-);
double T=A[][]*p+A[][];
return T;
}
int x[];
bool vis[];
double dp[];
int main()
{
while(~scanf("%d%lf",&n,&p))
{
int Max=-;
for(int i= ; i<=n ; i++)
scanf("%d",&x[i]),vis[x[i]]=,Max=max(Max,x[i]);
dp[]=;
dp[]=p;
if(vis[]) dp[]=;
if(vis[]) dp[]=;
for(int i= ; i<=Max+ ; i++)
{ dp[i]=dp[i-]*p + dp[i-]*(-p);
if(vis[i]) dp[i]=;
}
printf("%0.7f\n",dp[Max+]); }
}

poj3744 (概率DP+矩阵快速幂)的更多相关文章

  1. poj4474 Scout YYF I(概率dp+矩阵快速幂)

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

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

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

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

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

  4. POJ3744 Scout YYF I 概率DP+矩阵快速幂

    http://poj.org/problem?id=3744 题意:一条路,起点为1,有概率p走一步,概率1-p跳过一格(不走中间格的走两步),有n个点不能走,问到达终点(即最后一个坏点后)不踩坏点的 ...

  5. poj 3744 概率dp+矩阵快速幂

    题意:在一条布满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,100000000]. 每次前进p的概率前进一步,1-p的概率前进1-p步.问 ...

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

    题意: 一条路上,给出n地雷的位置,人起始位置在1,向前走一步的概率p,走两步的概率1-p,踩到地雷就死了,求安全通过这条路的概率. 分析: 如果不考虑地雷的情况,dp[i],表示到达i位置的概率,d ...

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

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

  8. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  9. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

随机推荐

  1. k8s--发展历程、知识图谱、组件说明

    kubernetes 1.发展历程 基础设施级服务infrastructure as a service 阿里云 平台设施级服务 platform as a service 新浪云 软件设施级服务 s ...

  2. Redis数据类型:Hashes、Geo操作指令

    Redis数据类型:Hashes.Geo操作指令 Hashes常用操作指令 Redis Hashes是一个键值对的映射表,最对能存储2^32-1(约40亿)个键值对. HSET HGET HSET:将 ...

  3. C#MessageBox 自动关闭窗口

    1:MessageBox弹出的模式窗口会先阻塞掉它的父级线程.所以我们可以考虑在MessageBox前先增加一个用于"杀"掉MessageBox窗口的线程.因为需要在规定时间内&q ...

  4. ubuntu18+virtualenv配置

    思路: 1.两条命令安装,加sudo是安装在/usr/local/bin/virtualenv路径下,不加就安装在home/.local下.注意,后面bashrc里,要设置的路径和这个有关系,所以要区 ...

  5. JavaScript基础3——使用Button提交表单

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 安装Erlang使用RabbitMQ

    首先登陆官网进行下载:https://www.erlang.org/downloads/20.3 本次下载的版本是20.3,rabbitmq准备使用3.7.17版本 现在开始安装 因为是使用c#语言, ...

  7. 【记录】mybatis mapper.xml 基础

    <choose> <when test=""> //... </when> <otherwise> //... </other ...

  8. html a标签链接点击闪动问题解决

    <a href="#">链接点击会闪动,解决: 这三种都可以用:<a href="javascript:;"></a>< ...

  9. java通过图片URL下载图片

    public InputStream getInputStream(String imgUrl) { InputStream inputStream = null; try{ HttpURLConne ...

  10. python3-调用函数

    Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://doc ...