对于每个点两个方向(两头只有一个方向)建一个点,然后预处理出每个点走k(1≤k≤n)k(1\le k\le n)k(1≤k≤n)到哪个点,列出方程式高斯消元就行了。记得前面bfsbfsbfs出那些点不可到,他们的期望没有意义。

方程式比较显然:

E[i]=∑k=1mpk∗(E[to(i,k)]+k)E[i]=\sum_{k=1}^mp_k*(E[to(i,k)]+k)E[i]=k=1∑m​pk​∗(E[to(i,k)]+k)

(to(i,k)to(i,k)to(i,k)表示iii点走kkk步到的点)

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 205;
const double eps = 1e-8; struct node {
int x, y;
node(){}
node(int x, int y):x(x), y(y){}
}b[MAXN]; double p[MAXN], a[MAXN][MAXN];
bool vis[MAXN]; inline bool gauss(int n) {
for(int j = 1; j <= n; ++j) {
if(!vis[j]) continue;
if(!a[j][j]) {
for(int i = j+1; i <= n; ++i)
if(a[i][j]) {
for(int k = j; k <= n+1; ++k)
swap(a[i][k], a[j][k]);
break;
}
}
if(fabs(a[j][j]) < eps) return 0;
for(int i = j+1; i <= n; ++i) if(vis[i]) {
double v = a[i][j] / a[j][j];
for(int k = j; k <= n+1; ++k)
a[i][k] -= v * a[j][k];
}
}
for(int i = n; i >= 1; --i) if(vis[i]) {
for(int j = i+1; j <= n; ++j) if(vis[j])
a[i][n+1] -= a[j][n+1] * a[i][j];
a[i][n+1] /= a[i][i];
}
return 1;
} int n, m, Y, X, D, cnt, id[MAXN][2], to[MAXN][MAXN]; queue<int>q;
inline bool bfs() {
memset(vis, 0, sizeof vis);
vis[id[X][D]] = 1;
q.push(id[X][D]);
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = 1; i <= m; ++i)
if(p[i] > eps && !vis[to[u][i]])
vis[to[u][i]] = 1, q.push(to[u][i]);
}
return vis[id[Y][0]] | vis[id[Y][1]];
} int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d%d%d%d", &n, &m, &Y, &X, &D); ++X, ++Y;
if(D == -1) D = X == 1;
else D ^= 1;
//0 -> leftwards
//1 -> rightwards for(int i = 1; i <= m; ++i) scanf("%lf", &p[i]), p[i] /= 100.0;
cnt = 0;
id[1][0] = id[1][1] = ++cnt; b[cnt] = node(1, 1);
id[n][0] = id[n][1] = ++cnt; b[cnt] = node(n, 0);
for(int i = 2; i < n; ++i)
id[i][0] = ++cnt, b[cnt] = node(i, 0),
id[i][1] = ++cnt, b[cnt] = node(i, 1); for(int i = 1; i <= cnt; ++i) {
node t = b[i];
t.x += t.y ? 1 : -1;
if(t.x == 1 || t.x == n) t.y ^= 1;
to[i][1] = id[t.x][t.y];
}
for(int j = 2; j <= m; ++j)
for(int i = 1; i <= cnt; ++i)
to[i][j] = to[to[i][j-1]][1];
if(!bfs()) puts("Impossible !");
else {
memset(a, 0, sizeof a);
for(int i = 1; i <= cnt; ++i) {
a[i][i] = 1;
if(!vis[i] || i == id[Y][0] || i == id[Y][1]) continue;
for(int j = 1; j <= m; ++j)
a[i][to[i][j]] -= p[j],
a[i][cnt+1] += p[j] * j;
}
if(!gauss(cnt)) puts("Impossible !");
double ans = a[id[X][D]][cnt+1];
printf("%.2f\n", ans);
}
}
}

Time travel HDU - 4418 (概率DP)的更多相关文章

  1. HDU 4599 概率DP

    先推出F(n)的公式: 设dp[i]为已经投出连续i个相同的点数平均还要都多少次才能到达目标状态. 则有递推式dp[i] = 1/6*(1+dp[i+1]) + 5/6*(1+dp[1]).考虑当前这 ...

  2. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  3. hdu 3853 概率dp

    题意:在一个R*C的迷宫里,一个人在最左上角,出口在右下角,在每个格子上,该人有几率向下,向右或者不动,求到出口的期望 现在对概率dp有了更清楚的认识了 设dp[i][j]表示(i,j)到(R,C)需 ...

  4. HDU 4815 概率dp,背包

    Little Tiger vs. Deep Monkey Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K ( ...

  5. hdu 4050(概率dp)

    算是挺简单的一道概率dp了,如果做了前面的聪聪于可可的话,这题不需要什么预处理,直接概率dp就行了... #include <stdio.h> #include <stdlib.h& ...

  6. HDU 4405 (概率DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4405 题目大意:飞行棋.如果格子不是飞行点,扔骰子前进.否则直接飞到目标点.每个格子是唯一的飞行起点 ...

  7. hdu 4336 概率dp + 状压

    hdu 4336 小吃包装袋里面有随机赠送一些有趣的卡片,如今你想收集齐 N 张卡片.每张卡片在食品包装袋里出现的概率是p[i] ( Σp[i] <= 1 ), 问你收集全部卡片所需购买的食品数 ...

  8. hdu 5001(概率DP)

    Walk Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  9. hdu 4576(概率dp+滚动数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576 思路:由于每次从某一位置到达另一位置的概率为0.5,因此我们用dp[i][j]表示第i次操作落在 ...

随机推荐

  1. 一个简单的一个sql表遍历

    简单的一个sql表遍历 一般我们写储存过程或者其他sql语句的时候都会用到循环遍历数据,最常用的两种就是 1.游标 2.临时表+while 下面贴出示例代码 DECLARE @MinReLogID I ...

  2. 将 PDF 论文的公式截图后转成 Word 可编辑公式(23)

    1. 问题 如何将PDF论文的公式截图后直接转成Word可编辑的公式? 2. 方法步骤 1.下载mathpix 2.使用mathpix截取公式,并生成LATEX 公式: 3.下载LaTeX转Word插 ...

  3. POJ 2299-Ultra-QuickSort-线段树的两种建树方式

    此题有两种建树方式! Description In this problem, you have to analyze a particular sorting algorithm. The algo ...

  4. python学习——while True的用法

    在学习过程中,经常能遇到采用while True的用法.下面以一个例子进行说明: 建立一个用户登录系统,用户输入用户名和密码,如果正确就可以进入系统. 1.我自己最开始的写法: d = {} #数据库 ...

  5. 关于mq的思考

    解耦场景 spark 发告警,同过kafka来解耦 削峰场景 日志采集生产环境几百台,当后续数量持续增加时,如果不加消息队列或者内存队列,可能把数据库打死 一个中间件: 为什么用 ->解决什么问 ...

  6. uboot中打开 debug调试信息的方法

    在uboot目录下include/common.h中, 原理:只需要让 _DEBUG 的值为 1即可. 最简单的做法就是在下图第一行之前添加 #define DEBUG

  7. php 配置微信公众号

    首先你要在微信公众号官网申请一个公众号,然后登录进去 在网页的左下方找到开发的基本配置 就可以开始配置服务器下面的东西了 点击打开成这个样子的 就是一些参数,url填写你自己服务器的具体地址就好了,我 ...

  8. (七)CXF之与spring整合发布web服务

    一.需求分析 用spring发布服务 二.案例 2.1 引入maven依赖 <dependencies> <!-- 添加Spring支持 --> <dependency& ...

  9. .NET Core使用swagger遇到的坑

    今天突然点开写好的接口,突然发现展开时同时展开了两个接口.如图 我点这两个接口任意一个,这两个都会同时展开或折叠. 原因是他们actinName相同,虽然在vs里面只要http方法不同,action是 ...

  10. POJ1083(Moving Tables)--简单模拟

    题目链接:http://poj.org/problem?id=1083 如图所示在一条走廊的两侧各有200个房间,现在给定一些成对的房间相互交换桌子,但是走廊每次只能通过一组搬运, 也就是说如果两个搬 ...