POJ 3744 Scout YYF I 概率dp+矩阵快速幂
题目链接:
http://poj.org/problem?id=3744
Scout YYF I
Time Limit: 1000MSMemory Limit: 65536K
#### 问题描述
> YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into the enemy's base. After overcoming a series difficulties, YYF is now at the start of enemy's famous "mine road". This is a very long road, on which there are numbers of mines. At first, YYF is at step one. For each step after that, YYF will walk one step with a probability of p, or jump two step with a probality of 1-p. Here is the task, given the place of each mine, please calculate the probality that YYF can go through the "mine road" safely.
输入
The input contains many test cases ended with EOF.
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].
输出
For each test case, output the probabilty in a single line with the precision to 7 digits after the decimal point.
样例输入
1 0.5
2
2 0.5
2 4
样例输出
0.5000000
0.2500000
题意
一个人从1号节点出发向右走,有n个位子有地雷,这个人走一步的概率为p,走两步的概率为1-p,现在问这个人安全走过去的概率为多少。
题解
由于雷很少,所以可以单独处理下有地雷的位置的时候的转移,比如x的位置有雷,那么就有
dp[x+1]=dp[x-1]*(1-p),dp[x+2]=dp[x+1]*p,。其他一整片没有雷的就直接矩阵快速幂干过去(类似于斐波那契数列),起始位置的概率为1.0,然后模拟扫过去求出dp[last+1]就可以了(last指最后一个雷的位置)。
代码
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef __int64 LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-9;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int maxn=2;
struct Matrix{
double mat[maxn][maxn];
Matrix(){ clr(mat,0); }
friend Matrix operator *(const Matrix& A,const Matrix& B){
Matrix ret;
for(int i=0;i<maxn;i++){
for(int j=0;j<maxn;j++){
for(int k=0;k<maxn;k++){
ret.mat[i][j]=ret.mat[i][j]+A.mat[i][k]*B.mat[k][j];
}
}
}
return ret;
}
}I;
Matrix pow(Matrix A,int n){
Matrix ret=I;
while(n){
if(n&1) ret=ret*A;
A=A*A;
n/=2;
}
return ret;
}
int n;
double p;
int main() {
rep(i,0,maxn) I.mat[i][i]=1;
while(scf("%d%lf",&n,&p)==2&&n){
vector<int> arr;
rep(i,0,n){
int x; scf("%d",&x);
arr.pb(x);
}
sort(all(arr));
arr.erase(unique(all(arr)),arr.end());
if(arr.sz()==0){ prf("1.0000000\n"); continue; }
bool su=true;
if(arr[0]==1) su=false;
else{
for(int i=0;i<arr.sz()-1;i++){
if(arr[i+1]-arr[i]==1){
su=false; break;
}
}
}
if(!su){ prf("0.0000000\n"); continue; }
Matrix A;
A.mat[0][0]=p, A.mat[0][1]=1-p;
A.mat[1][0]=1, A.mat[1][1]=0;
double pre=1.0;
for(int i=0;i<arr.sz();i++){
int cnt;
if(i==0) cnt=arr[i]-1;
else cnt=arr[i]-arr[i-1]-1;
if(cnt==1){ pre*=(1-p); }
else{
double f0=pre,f1=pre*p;
Matrix vec;
vec.mat[0][0]=pre*p;
vec.mat[1][0]=pre;
vec=pow(A,cnt-2)*vec;
pre=vec.mat[0][0];
pre*=(1-p);
}
}
prf("%.7f\n",pre);
}
return 0;
}
//end-----------------------------------------------------------------------
POJ 3744 Scout YYF I 概率dp+矩阵快速幂的更多相关文章
- 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个点不能走,问到达终点(即最后一个坏点后)不踩坏点的 ...
- 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 ...
随机推荐
- linux-RPM 打包原理 SPEC 编写规范
一.编写spec脚本 由前面的日志了解到,生成rpm除了源码外,最重要的就是懂得编写.spec脚本.rpm建包的原理其实并不复杂,可以理解为按照标准的格式整理一些信息,包括:软件基础信息,以及安装.卸 ...
- # 20155229 2016-2017-2 《Java程序设计》第七周学习总结
20155229 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 第十二章 lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装 ...
- C# WPF Image控件下对于Base64的转化显示
原文:C# WPF Image控件下对于Base64的转化显示 算作前言 本文对图片如何转化成base64不做描述,我们可以从很多途径了解到转化办法.却很少有博客提到怎么在WPF的Image控件中显示 ...
- 成都Uber优步司机奖励政策(4月20日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- jQuery学习-事件绑定
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【转载】进程内COM与进程外COM
原文:http://www.cnblogs.com/jyz/archive/2009/03/08/1406229.html 1.进程内和进程外Com COM/DCOM 组件可以在DLL 或EXE 文档 ...
- 1-[Mysql]-数据库介绍及安装
1.数据库概述 1.数据库服务器: 运行数据库管理软件的计算机 2.数据库管理软件:mysql oracle db2 sqlserver 3.库:文件夹 4.表:文件 5.记录:事物的一系列典型特征: ...
- wannafly 17D 01序列2
水题. 假设有两个二进制数a,b,c=a+b(a,b拼接起来) 那么显然如果b长度为偶数\(c\mod 3=(b\mod 3+a\mod 3)\mod 3\) 否则\(c\mod 3=(b\mod 3 ...
- springmvc 解决@ResponseBody注解返回中文乱码
使用messageConverters <bean class="org.springframework.web.servlet.mvc.method.annotation.Reque ...
- burp抓取手机包
burp监听ip和端口要填对应的使用的ip,比如建立了一个网卡wifi,那就填那个ip 手机代理连接wifi的话,就直接先看能不能访问burp监听的端口,然后填上相同代理即可.