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 ...
随机推荐
- <Docker学习>6. docker使用网络
在容器中部署一个web应用,外部如何访问? 容器与容器间如何访问? 外部访问容器 容器可以运行一些网络应用,让外部也可以访问的话,需要进行服务器和容器的端口映射 -p 或者 -P -P默认会分配一个4 ...
- Gson转Map时,Int会变成double解决方法
package com.cdy.demo; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; ...
- strak组件(8):基本增删改查实现及应用和排序
效果图: 新增函数: def reverse_common_url(self, name, *args, **kwargs) 反向生成url,需要传增删改的url作为参数,携带原参数 def reve ...
- Educational Codeforces Round 42D. Merge Equals(STL)
D. Merge Equals time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces Round #449 (Div. 2) C. DFS
C. Nephren gives a riddle time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- python-1基础总结
输入 >>> name = input() 1--如果字符串里面有很多字符都需要转义,就需要加很多\,为了简化,Python还允许用r''表示''内部的字符串默认不转义,可以自己试 ...
- 理解线程3 c语言示例线程基本操作
Table of Contents 1. 基本线程的动作 1.1. 设置线程属性 1.1.1. 设置脱离状态 1.1.2. 设置调度属性 1.2. 取消线程 1.3. 主线程创建多个线程示例 2. 了 ...
- 洛谷P1451 求细胞数量
求细胞数量 题目链接 这道题大概是一个最简单的联通块的题了qwq 注意枚举起点的时候 一定不要从0开始不然你就会从0进入到了其他联通块中从而多查. 一定看清题意这道题不是同色为联通块!!! AC代码如 ...
- PQFitness
<html> <head> <title></title> <style> *{margin:o;padding:0;} #header{ ...
- objc中的类方法和实例方法有什么本质区别和联系
类方法: 类方法是属于类对象的 类方法只能通过类对象调用 类方法中的self是类对象 类方法可以调用其他的类方法 类方法中不能访问成员变量 类方法中不能直接调用对象方法 类方法是存储在元类对象的方法缓 ...