poj 3744 Scout YYF 1 (概率DP+矩阵快速幂)
Description
Input
Each test case contains two lines.
The First line of each test case is N (1 ≤ N ≤ 10) and p (0.25 ≤ p ≤ 0.75) seperated by a single blank, standing for the number of mines and the probability to walk one step.
The Second line of each test case is N integer standing for the place of N mines. Each integer is in the range of [1, 100000000].
Output
Sample Input
1 0.5
2
2 0.5
2 4
Sample Output
0.5000000
0.2500000
题意:
有一段路,路上有n个陷阱,每一次只能向前走一步或者两步,求安全走过这段路的改路
分析:
设dp[i]表示安全走过第i个陷阱的概率
那么dp[i+1]=dp[i]*(1-p(走到第i+1个陷阱))
因为每次只能走一步或者两步,所有安全走过第i个陷阱后的位置一定在a[i]+1;
其中a[i]表示第i个陷阱的位置
求从a[i]+1,走到a[i+1]的概率的时候我们需要用到矩阵来经行优化
ans[i]表示走到位置i的概率
ans[i] = p*ans[i-1]+(1-p)*ans[i-2];
ans[0]=1;
都说G++比C++要好,但是本题最好用C++提交。
如果用G++提交,浮点型输出一定要用%f,否则会WA。
这是因为G++标准的浮点型输出用%f,而不是%lf。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#include <string.h>
using namespace std;
const int maxn=;
int cnt[maxn];
double dp[maxn];
double p;
int n;
struct matrix
{
double data[][];
};//定义成封装结构体 二维数组无法return
matrix I={,,,};
matrix multi(matrix a,matrix b)
{
matrix c;
memset(c.data,,sizeof(c.data));
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
c.data[i][j]+=a.data[i][k]*b.data[k][j];
return c;
}
double pow1(matrix a,int b)
{
matrix ans=I;
while(b)
{
if(b&)
ans=multi(ans,a);
b>>=;
a=multi(a,a);
}
return ans.data[][];
}
int main()
{
while(cin>>n>>p)
{
memset(dp,,sizeof(dp)); //该初始化的地方一定要初始化
cnt[]=; //为第一个雷做准备的
for(int i=;i<=n;i++)
cin>>cnt[i];
sort(cnt,cnt+n+);
dp[]=1.0; //不是0
matrix a={p,-p,,}; //初始化矩阵,注意这个的推导过程
for(int i=;i<=n;i++)
//要1减去这个概率 因为这个概率是踩上雷的
dp[i]=dp[i-]*(-pow1(a,cnt[i]-cnt[i-]-)); //注意不要丢括号
//注意是乘法不是加法 把每段概率乘起来
//注意是-1不是+1
//从上一个雷的下一个起 要走cnt[i]-cnt[i-1]-1步 才能到达下一个雷
//雷在1和5 从2走到5 需要3步 5-1-1=3
printf("%.7f\n",dp[n]);
}
return ;
}
poj 3744 Scout YYF 1 (概率DP+矩阵快速幂)的更多相关文章
- POJ 3744 Scout YYF I 概率dp+矩阵快速幂
题目链接: http://poj.org/problem?id=3744 Scout YYF I Time Limit: 1000MSMemory Limit: 65536K 问题描述 YYF is ...
- POJ3744 Scout YYF I 概率DP+矩阵快速幂
http://poj.org/problem?id=3744 题意:一条路,起点为1,有概率p走一步,概率1-p跳过一格(不走中间格的走两步),有n个点不能走,问到达终点(即最后一个坏点后)不踩坏点的 ...
- poj 3744 Scout YYF I(概率dp,矩阵优化)
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5020 Accepted: 1355 Descr ...
- Scout YYF I POJ - 3744(概率dp + 矩阵快速幂)
题意: 一条路上有n个地雷,你从1开始走,单位时间内有p的概率走一步,1-p的概率走两步,问安全通过这条路的概率 解析: 很容易想到 dp[i] = p * dp[i-1] + (1 - p) * d ...
- poj4474 Scout YYF I(概率dp+矩阵快速幂)
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4100 Accepted: 1051 Descr ...
- 刷题总结—— Scout YYF I(poj3744 矩阵快速幂+概率dp)
题目: Description YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate int ...
- poj3744 (概率DP+矩阵快速幂)
http://poj.org/problem?id=3744 题意:在一条铺满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,10000000 ...
- poj3744 Scout YYF I[概率dp+矩阵优化]
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8598 Accepted: 2521 Descr ...
- POJ 3744 Scout YYF I (概率dp+矩阵快速幂)
题意: 一条路上,给出n地雷的位置,人起始位置在1,向前走一步的概率p,走两步的概率1-p,踩到地雷就死了,求安全通过这条路的概率. 分析: 如果不考虑地雷的情况,dp[i],表示到达i位置的概率,d ...
随机推荐
- php扩展开发-面向对象
在zval变量里IS_OBJECT类型使用zend_object_value来保存变量的,我们看一下他的具体结果. typedef struct _zend_object_value { zend_o ...
- 笔记-python-module-logging.循环日志、多进程日志
笔记-python-module-logging.循环日志.多进程日志 1. logging循环日志 循环日志分为按大小切分和按时间切分,对应实现类如下. 1.1. RotatingFil ...
- C# Dictionary的遍历理解
C# Dictionary容器类的理解 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/det ...
- 2 Mongodb基本操作
1.基本操作 MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成 MongoDB文档类似于JSON对象,字段值可以包含其他文档.数组.文档数组 安装管理mongod ...
- 关于Python、Java、C#语言的一些比较
不能说某某语言不好! 首先,千万别说某一个语言好不好,应为这样的用词是错的,我曾经在好多场合听到一些程序员说java好,.net不好这类的话. 其实语言不分好坏,只是在具体的某些领域或业务场景上不合适 ...
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目5
2014-03-20 03:23 题目:给定一个字符串,输出其全排列. 解法:可以调用STL提供的next_permutation(),也可以自己写一个.对于这种看起来简单的题目,应该在能优化的地方, ...
- Jmeter的好搭档Badboy的安装与简单使用
前提: Windows7 64位 Jdk 1.8 1.在官网上下载badboy并安装 网址:http://www.badboy.com.au/download/add 我下载的是最新的2.2.5这个 ...
- python中字符串是特殊的列表
for x in range(20): print 'fizz'[x%3*4::]+'buzz'[x%5*4::]or x 这个是由 Jeff Atwood推广的一个编程练习叫FizzBuzz,问题如 ...
- 孤荷凌寒自学python第三十二天python的代码块中的异常的捕获
孤荷凌寒自学python第三十二天python的代码块中的异常的捕获 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天简单了解了Python的错误陷阱,了解到其与过去学过的其它语言非常类似 ...
- Anaconda基本使用
anaconda常用使用命令 显示安装程序包列表 conda list 选择其它的源 conda config --add channels https://mirrors.tuna.tsinghua ...