对于每个点两个方向(两头只有一个方向)建一个点,然后预处理出每个点走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. [转帖]Linux命令pmap

    Linux命令pmap https://www.cnblogs.com/lnlvinso/p/5272771.html jmap可以查看Java程序的堆内存使用情况,pmap可以查看Linux上运行的 ...

  2. Fiddler之基础:面板、图标介绍

    1.面板介绍:菜单栏,工具栏,回话面板,监控面板 2.工具栏-图标 3.会话面板-图标 4.监控面板 5.状态栏 控制台Fiddler的左下角有一个命令行工具叫做QuickExec,允许你直接输入命令 ...

  3. 前后端分离,如何防止api接口被恶意调用或攻击

    无论网站,还是App目前基本都是基于api接口模式的开发,那么api的安全就尤为重要了.目前攻击最常见的就是“短信轰炸机”,由于短信接口验证是App,网站检验用户手机号最真实的途径,使用短信验证码在提 ...

  4. go 结构体定义和结构体指针

    结构体一个结构体(`struct`)就是一个字段的集合. 将来要使用它向java .C# 中的class 有相同的地位 struct 可以用来值传递 同时可以通过引用传递参数(地址) java C# ...

  5. 在docker下SQL Server attach mdf和ldf文件

    (DB:MyPost) USE masterGO-- Create database via attachCREATE DATABASE [MyPost]    ON ( FILENAME = N'C ...

  6. aspnet core 全局模型验证,统一api响应

    上手就来 新建一个模型验证过滤器,其中ApiResp是自定义的统一响应类. public class VldFilter:IActionFilter { /// <summary> /// ...

  7. LeetCode:626.换座位

    题目链接:https://leetcode-cn.com/problems/exchange-seats/ 题目 小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们 ...

  8. MYSQL日期相关操作

    *******MYSQL中取当前周/月/季/年的第一天与最后一天******* 当年第一天: SELECT DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 ...

  9. form-create教程:移除默认提交按钮

    本文将介绍form-create如何修改,隐藏默认提交按钮 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue 组件.结 ...

  10. div上中下布局中间自适应

    需求1: 头尾固定高度,中间自适应 1.上部(header)Div高度固定100px,宽度100%: 2.下部(footer)Div高度固定100px,宽度100%: 3.中部(middle)DIV高 ...