Scout YYF I POJ - 3744(矩阵优化)
题意:一条路上有n个地雷,给出地雷的位置。某人从起点(位置1)出发,走一步的概率是p,走两步的概率是(1-p),然后问有多少概率走过这个雷区。
思路:
只要走过最后一个地雷就代表走过雷区了。
而每到 i 这个地方,无非是前一步和前两步走过来的。那么公式就是dp[ i ]= p*dp[ i-1 ]+dp[ i-2]*(1-p)
这是连续没有地雷的区域的走法。那么有地雷呢?

把有红圈的表示地雷。那么像图上进行分段,将上一段不踩雷的概率就可以当做下一段的开始的概率。
则 dp[ a[i] +1] = 1 - d[ a[i] ]; 那么这样就化成求每一段的概率直接相乘就行了。
优化: 如果直接乘得话,会超时数据量太大。那么,观察dp[ i ]= p*dp[ i-1 ]+dp[ i-2]*(1-p), 可以很容易得到这是一个类似 a(n) = p*a(n-1)+ q*a(n-1)
的数列, 那么直接矩阵快速幂就行了。
细节:注意,输入的每个地雷的坐标是无序,所以要先对其排序,还有就是,输入了重复的地雷,但是对于幂来说,不需要负数,所以当相同坐标的地雷就不用计算了。
ac代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
struct jz
{
double num[][];
jz operator*(const jz &p)const
{
jz ans;
for (int i = ; i < ;++i)
for (int j = ; j < ; ++j)
{
ans.num[i][j] = ;
for (int k = ; k < ; ++k)
ans.num[i][j] += num[i][k] * p.num[k][j];
}
return ans;
}
};
jz POW(jz x, int n)
{
jz ans;
memset(ans.num, , sizeof(ans.num));
for (int i = ; i < ; ++i) ans.num[i][i] = ;
while (n)
{
if (n & )ans = ans*x;
x = x*x;
n >>= ;
}
return ans;
}
int a[];
int main()
{
int n;
double p;
jz dp;
while (scanf("%d%lf", &n, &p)!=EOF)
{
dp.num[][] = p; dp.num[][] = 1.0 - p;
dp.num[][] = 1.0; dp.num[][] = 0.0;
for (int i = 1.0; i <= n; ++i) scanf("%d", a+i);
sort(a+, a + n+);
double sum = 1.0;
for (int i = ; i <= n; ++i)
{
if (a[i] == a[i - ])continue;
jz ans = POW(dp, a[i] - a[i - ] - );
sum *= (1.0 - ans.num[][]);
}
printf("%.7lf\n", sum);
}
return ;
}
Scout YYF I POJ - 3744(矩阵优化)的更多相关文章
- poj3744 Scout YYF I[概率dp+矩阵优化]
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8598 Accepted: 2521 Descr ...
- Scout YYF I POJ - 3744【矩阵乘法优化求概率】
题意: 一条路上有 $n$ 个地雷,YYF 从位置 $1$ 出发,走一步的概率为 $p$,走两步的概率是 $(1-p)$.求 YYF 能顺利通过这条路的概率. 数据范围: $1\leq n \leq ...
- Scout YYF I POJ - 3744(概率dp + 矩阵快速幂)
题意: 一条路上有n个地雷,你从1开始走,单位时间内有p的概率走一步,1-p的概率走两步,问安全通过这条路的概率 解析: 很容易想到 dp[i] = p * dp[i-1] + (1 - p) * d ...
- 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 ...
- 概率dp(A - Scout YYF I POJ - 3744 )
题目链接:https://cn.vjudge.net/contest/276241#problem/A 题目大意:首先输入n和p,n代表地雷的个数,p代表走一步的概率,1-p代表走两步的概率,然后问你 ...
- POJ 3744 Scout YYF I 概率dp+矩阵快速幂
题目链接: http://poj.org/problem?id=3744 Scout YYF I Time Limit: 1000MSMemory Limit: 65536K 问题描述 YYF is ...
- poj 3744 Scout YYF 1 (概率DP+矩阵快速幂)
F - Scout YYF I Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- POJ3744 Scout YYF I 概率DP+矩阵快速幂
http://poj.org/problem?id=3744 题意:一条路,起点为1,有概率p走一步,概率1-p跳过一格(不走中间格的走两步),有n个点不能走,问到达终点(即最后一个坏点后)不踩坏点的 ...
- 刷题总结—— Scout YYF I(poj3744 矩阵快速幂+概率dp)
题目: Description YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate int ...
随机推荐
- 一个复杂Json的解析
{ "website": { "1": { "basic": { "homepage": "http://py ...
- 正则表达式,re模块
一,正则表达式 正则表达式是对字符串操作的一种逻辑公式,我们一般使用正则表达式对字符串进行匹配和过滤,使用正则的优缺点,我们可以去http://tool.chinaz.com/regex/进行测试. ...
- .14-浅析webpack源码之Watchpack模块
解决掉了最头疼的DirectoryWatcher内部实现,这一节可以结束NodeWatchFileSystem模块. 关于watch的应用场景,仔细思考了下,这不就是热重载的核心嘛. 首先是监视文件, ...
- SQL while循环
ALTER Proc [dbo].[p_GetServerDataCursor] AS BEGIN IF EXISTS ( SELECT * FROM sys.objects WHERE object ...
- 【Java】HashMap源码分析——常用方法详解
上一篇介绍了HashMap的基本概念,这一篇着重介绍HasHMap中的一些常用方法:put()get()**resize()** 首先介绍resize()这个方法,在我看来这是HashMap中一个非常 ...
- Python编程-从入门到实践 Eric Matthes 著 袁国忠 译 - - 第二章 动手试一试
因为第一章的动手试一试基本都是探索性的,所以直接进入第二章. # 2.2 动手试一试 # 2_1 简单消息: 将一条消息存储到变量中,再将其打印出来. message = 'python 编程从入门到 ...
- JS如何判断一个对象是否为空、是否有某个属性
一.js判断一个对象是否为空 方法一: let obj1 = {} let obj2 = {a:1} function empty(obj){ for (let key in obj){ return ...
- javascript刷新父页面的各种方法汇总
1.用iframe.弹出子页面刷新父页面iframe <script language=JavaScript> parent.location.reload(); </script& ...
- npm 全局执行 update 、 outdated 出现 npm-debug.log 404 错误的问题
想要执行一次全局更新,发现屡次报错: # npm update -g 提示的错误信息包含如下内容: npm ERR! code E404 npm ERR! 404 Registry returned ...
- html一些标签在不同浏览器或者不同版本浏览器的注意事项
最近在IE10下运行一个以前的做web系统发现了两个小问题: 一.图片上使用"alt"属性来添加一些文字提示信息在IE10下无法正常显示出来 上网查了一下原因:原来是现在一 ...