对于每个点两个方向(两头只有一个方向)建一个点,然后预处理出每个点走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. 多线程(5) — JDK的并发容器

    JDK提供了一些高效的并发容器,下面介绍几个 ConcurrentHashMap:这是个高效的并发HashMap,可以理解为一个线程安全的HashMap. CopyOnWriteArrayList:这 ...

  2. 扩散:Apache2放开virtualhost,wamp启动apache服务失败

    原文链接:https://blog.csdn.net/weixin_45688623/article/details/101423164 CSDN写过过程了,有点长,这里不赘述了,只写最后我设置的结果 ...

  3. logstash grok nginx log

    #cat logstash.conf input { file { path => "/alidata/logs/nginx/appapi.dayutang.cn.access*.lo ...

  4. opencv实现人脸识别(一)opencv的相关知识了解

    这回进行了人脸识别的项目,对学习过程进行记录. 首先进行的就是一系列环境的配置,如 python3.7的安装, python的IDE  pycharm的安装,然后进行opencv库的安装,可以通过py ...

  5. 1201: 位运算之拼整数(Java)

    WUSTOJ 1201: 位运算之拼整数 题目 原题链接 参考博客 XXXXXyun的博客--输入十六进制数 Description 输入无符号短整数k[hex.]和p[oct.],将k的高字节作为结 ...

  6. javascript 写一个ajax 自动拦截,并下载数据

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  7. 19-MySQL DBA笔记-操作系统、硬件、网络的优化

    第19章 操作系统.硬件.网络的优化 本章将介绍操作系统和硬件的性能优化,对于硬件,我们主要讲述CPU.内存.磁盘阵列及固态硬盘.任何优化,首先都需要有足够的数据支持,对于操作系统下性能数据的收集,这 ...

  8. Spring Boot 使用 @Scheduled 注解创建定时任务

    在项目开发中我们经常需要一些定时任务来处理一些特殊的任务,比如定时检查订单的状态.定时同步数据等等. 在 Spring Boot 中使用 @Scheduled 注解创建定时任务非常简单,只需要两步操作 ...

  9. vue.js入门语法

    1.入门 <div id="vue_det"> <h1>site : {{site}}</h1> //两个大括号显示参数 <h1>u ...

  10. 关闭google默认打开翻译提醒

    关闭google默认打开翻译提醒 在header中添加以下代码: <meta name="google" content="notranslate" /& ...