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 ...
随机推荐
- NLog 配置
之前我介绍过如何使用log4net来记录日志,但最近喜欢上了另一个简单好用的日志框架NLog. 关于NLog和log4net的比较这里就不多讨论了,感兴趣的朋友可以参看.NET日志工具介绍和log4n ...
- T-SQL:CTE用法(十)
CTE 也叫公用表表达式和派生表非常类似 先定义一个USACusts的CTE WITH USACusts AS ( SELECT custid, companyname FROM Sales.Cust ...
- mvc导出excel记录
前言: 记录这篇使用记录,是为了方便以后学习查阅和让没有使用过的人了解一下,其中不足还请见谅.不是很全的文章,大神请绕行.在项目中我们或多或少的会遇到数据导出到excel表格以便线下查看或者记录一些需 ...
- Python入门到精通学习书籍推荐!
1.Python基础教程(第2版 修订版)<Python基础教程(第2版修订版)>包括Python程序设计的方方面面,内容涉及的范围较广,既能为初学者夯实基础,又能帮助程序员提升技能,适合 ...
- JavaSE Lambda表达式(JDK1.8新特性)
在前面有一篇写到了Lambda表达式,现在可以给你们介绍什么是Lambda表达式 现在有很多老程序员都不喜欢这个函数式编程思想 主要就一点 : 老程序员习惯了 面向过程 写程序,而Lambda表达式是 ...
- The Most Simple Introduction to Hypothesis Testing
https://www.youtube.com/watch?v=UApFKiK4Hi8
- 5大JavaScript前端框架简介
译者按: 简要介绍五大前端框架特性 原文: Top 5 JavaScript Frameworks 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用 ...
- 跨站请求伪造(CSRF)
1. 什么是跨站请求伪造(CSRF) CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者session Riding,通常缩 ...
- AspNetCore2 Hangfire定时任务
Hangfire 是一个简单的用于.net及.net core 应用程序,通过数据库持久化,定时执行后台任务的组件 1.通过NuGet安装Hangfire 2.在Startup.cs文件的Config ...
- MySQL 8.0 —— 数据字典
1.简介 MySQL 8.0 将数据库元信息都存放于InnoDB存储引擎表中,在之前版本的MySQL中,数据字典不仅仅存放于特定的存储引擎表中,还存放于元数据文件.非事务性存储引擎表中.本文将会介绍M ...