poj 3744 Scout YYF I (矩阵)

Description

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.

Input

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].

Output

For each test case, output the probabilty in a single line with the precision to 7 digits after the decimal point.

Sample Input

1 0.5
2
2 0.5
2 4

Sample Output

0.5000000
0.2500000

Source

POJ Monthly Contest - 2009.08.23, Simon

又是一题矩阵乘法……

这题很显然了, n个雷,分别在 a[1]...a[n] ,走一步概率为 p ,走两步概率为 1-p ,一开始在 1 号位置,问安全到达终点的概率。

显然,如果k 号位有雷,那么安全通过这个雷只可能是在 k-1 号位选择走两步到 k+1 号位。因此,可以得到如下结论:在第 i 个雷的被处理掉的概率就是从 a[i-1]+1 号位到 a[i] 号位的概率。于是,可以用 1 减去就可以求出安全通过第 i 个雷的概率,最后乘起来即可,比较悲剧的是数据很大,所以需要用到矩阵快速幂……

类似斐波那契数列,有ans[i]=p*ans[i-1]+(1-p)*ans[i-2] ,构造矩阵为

|p  1-p |     ans[i-1]   ans[i]

|1  0    |     ans[i-2]  ans[i-1] 

 1 //ans[i]=p*ans[i-1]+(1-p)*ans[i-2]
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<stdlib.h>
 8 using namespace std;
 9 #define N 16
10 int n;
11 double p;
12 int a[N];
13
14 struct Matrix
15 {
16     double m[3][3];
17     Matrix()
18     {
19         memset(m,0,sizeof(m));
20         for(int i=0;i<2;i++)
21             m[i][i]=1;
22     }
23 };
24
25 Matrix Mul(Matrix a,Matrix b)
26 {
27     Matrix res;
28     int i,j,k;
29     for(int i=0;i<2;i++)
30     {
31         for(int j=0;j<2;j++)
32         {
33             res.m[i][j]=0;
34             for(int k=0;k<2;k++)
35             {
36                 res.m[i][j]=res.m[i][j]+(a.m[i][k]*b.m[k][j]);
37             }
38         }
39     }
40     return res;
41 }
42 Matrix fastm(Matrix a,int b)
43 {
44     Matrix res;
45     while(b)
46     {
47         if(b&1)
48            res=Mul(res,a);
49         a=Mul(a,a);
50         b>>=1;
51     }
52     return res;
53 }
54
55 int main()
56 {
57     while(scanf("%d%lf",&n,&p)!=EOF)
58     {
59         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
60
61         sort(a+1,a+n+1);
62         double ans=1;
63         Matrix tmp;
64         tmp.m[0][0]=p;
65         tmp.m[0][1]=1-p;
66         tmp.m[1][0]=1;
67         tmp.m[1][1]=0;
68
69         Matrix cnt;
70         cnt=fastm(tmp,a[1]-1);
71         ans*=(1-cnt.m[0][0]);
72         for(int i=2;i<=n;i++)
73         {
74             if(a[i]==a[i-1]) continue;
75             cnt=fastm(tmp,a[i]-a[i-1]-1);
76             ans*=(1-cnt.m[0][0]);
77         }
78
79         printf("%.7lf\n",ans);
80
81     }
82     return 0;
83 }

时间: 2024-10-12 11:41:36

poj 3744 Scout YYF I (矩阵)的相关文章

POJ 3744 Scout YYF I 矩阵快速幂

Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4452   Accepted: 1159 Description 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,

POJ 3744 Scout YYF I 矩阵快速幂优化--概率dp

点击打开链接 Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5416   Accepted: 1491 Description 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 diffic

POJ 3744 Scout YYF I(矩阵优化的概率DP)

解题思路: dp[i] = p * dp[i-1] + (1 - p) * dp[i-2]; 由于N比较大,dp[i]需要用矩阵快速幂求解. 安全通过整段路的概率等于安全通过每一个两个炸弹区间的概率乘积. #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #

POJ 3744 Scout YYF I(矩阵快速幂 概率dp)

题目链接:http://poj.org/problem?id=3744 Description 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"

poj 3744 Scout YYF I(概率dp,矩阵优化)

Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5020   Accepted: 1355 Description 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,

poj 3744 Scout YYF I 概率dp+矩阵乘法

分析: dis(k,v1,v2)函数求到当前位置概率为v1,到当前位置之前一步的概率为v2,前进k步到达位置的概率,然后矩阵加速. 代码: //poj 3744 //sep9 #include <iostream> #include <algorithm> using namespace std; int pos[12]; double p,mat[4][4]; double ans[4][4]; void mul1() { double c[4][4]; c[0][1]=c[1]

poj 3744 Scout YYF I(矩阵优化概率DP)

Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5153   Accepted: 1404 Description 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,

poj 3744 Scout YYF I(矩阵优化概率)

http://poj.org/problem?id=3744 有n个雷,某人的起始位置在1,每次走一步的概率为p,走两步的概率是1-p,给出n个雷的位置,问最后成功走出雷区的概率. 放在高中应该是很简单的分步乘法求概率.即把每一个雷都没踩到的概率求出来,最后n个相乘就是顺利通过的概率.对于输入的n个位置进行分段1~num[1],num[1]+1~num[2]......每一段都只有一个雷num[i],每一段内踩不到雷的概率就是1-踩到num[i]雷的概率. 设dp[i]表示踩到第i个雷的概率,那

poj 3744 Scout YYF I (概率DP+矩阵快速幂)

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5062   Accepted: 1370 Description 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