luoguP4206 [NOI2005]聪聪与可可 期望概率DP
首先,分析一下这个猫和鼠
猫每局都可以追老鼠一步或者两步,但是除了最后的一步,肯定走两步快些....
既然猫走的步数总是比老鼠多,那么它们的距离在逐渐缩小(如果这题只能走一步反而不能做了...)
猫不知道老鼠下一步走哪里,猫走的时候依据的是老鼠当前的位置
明显,猫走的位置没有什么规律可言(即使有规律还是会预处理啊.....)
我们可以在$O(n^2 + nm)$的复杂度内预处理出$s(i, j)$表示猫在$i$,老鼠在$j$时,猫下一步的位置...
直接设$f(i, j)$表示猫在$i$,老鼠在$j$时猫吃到老鼠的期望步数
那么有$f(i, i) = 0$
并且$f(i, s(i, j)) = 1,f(i, s(s(i, j), j)) = 1 (i \neq j)$
其余情况下$f(i, j) = \sum\limits_{v = j | e(j, v)} \frac{f(s(s(i, j), j), v) + 1}{du[j] + 1}$
由于猫鼠距离减小,因此转移具有拓扑序
可以根据猫鼠距离排序转移,也可以直接$dfs$
由于$dfs$好写,因此这里选择$dfs$
复杂度$O(n^2 + nm)$
#include <cstdio>
#include <iostream>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} #define de double
#define sid 1005
#define eid 5005
#define ri register int int n, m, s, t, cnp;
int cap[eid], nxt[eid], node[eid], q[eid];
int du[sid], dis[sid][sid], nx[sid][sid];
de f[sid][sid]; void adeg(int u, int v) {
du[u] ++;
nxt[++ cnp] = cap[u]; cap[u] = cnp; node[cnp] = v;
} #define cur node[i]
void Pre() {
for(ri u = ; u <= n; u ++) {
int fr = , to = ;
q[++ to] = u; dis[u][u] = ;
while(fr <= to) {
int o = q[fr ++];
for(ri i = cap[o]; i; i = nxt[i])
if(dis[u][cur] == 1e5)
dis[u][cur] = dis[u][o] + , q[++ to] = cur;
}
}
for(ri u = ; u <= n; u ++)
for(ri v = ; v <= n; v ++) {
int w = 1e5;
for(ri i = cap[u]; i; i = nxt[i])
if(dis[cur][v] < w || (dis[cur][v] == w && nx[u][v] > cur))
nx[u][v] = cur, w = dis[cur][v];
}
} de dfs(int a, int b) {
if(f[a][b] != -) return f[a][b];
if(a == b) return f[a][b] = ;
int to = nx[a][b], toto = nx[to][b];
if(to == b || toto == b) return f[a][b] = ;
f[a][b] = ;
for(int i = cap[b]; i; i = nxt[i])
f[a][b] += (dfs(toto, cur) + ) / (de)(du[b] + );
f[a][b] += (dfs(toto, b) + ) / (de)(du[b] + );
return f[a][b];
} int main() {
n = read(); m = read();
s = read(); t = read();
for(ri i = ; i <= m; i ++) {
int u = read(), v = read();
adeg(u, v); adeg(v, u);
} for(ri i = ; i <= n; i ++)
for(ri j = ; j <= n; j ++)
dis[i][j] = 1e5, f[i][j] = -; Pre();
printf("%.3lf\n", dfs(s, t));
return ;
}
luoguP4206 [NOI2005]聪聪与可可 期望概率DP的更多相关文章
- BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp
首先这道题让我回忆了一下最短路算法,所以我在此做一个总结: 带权: Floyed:O(n3) SPFA:O(n+m),这是平均复杂度实际上为O(玄学) Dijkstra:O(n+2m),堆优化以后 因 ...
- BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs
BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...
- HDU 3853 期望概率DP
期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] , 右移:[x][y ...
- 【BZOJ 3652】大新闻 数位dp+期望概率dp
并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的 ...
- 【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基
大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了 期望概率 ...
- 【NOIP模拟赛】黑红树 期望概率dp
这是一道比较水的期望概率dp但是考场想歪了.......我们可以发现奇数一定是不能掉下来的,因为若奇数掉下来那么上一次偶数一定不会好好待着,那么我们考虑,一个点掉下来一定是有h/2-1个红(黑),h/ ...
- 期望概率DP
期望概率DP 1419: Red is good Description 桌面上有\(R\)张红牌和\(B\)张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付 ...
- bzoj1415 [Noi2005]聪聪和可可【概率dp 数学期望】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1415 noip2016 D1T3,多么痛的领悟...看来要恶补一下与期望相关的东西了. 这是 ...
- HYSBZ 1415 - 聪聪和可可(概率DP)
http://vjudge.net/problem/viewProblem.action?id=20613 题意:不用说了,中文题. 这个题可以用概率DP来做. 题中要求猫抓到老鼠的时间期望.分析一下 ...
随机推荐
- Spring boot初始
1 创建pom.xml parent:org.springframework.boot 包含启动的依赖 添加依赖,如 spring-boot-starter-web mvn dependency:t ...
- 【BZOJ】2165: 大楼
[题意]从第0层开始有无穷层,每层有n个房间,给定矩阵A,A[i][j]表示从第x层的房间 i 可以跳到第x+A[i][j]层的房间 j (x任意),A[i][j]=0表示不能跳.初始在第0层第1个房 ...
- mysql-connector-python取二进制字节时报错UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 0
在储存用户密码时,我使用了hmac算法对用户密码加密,加密出来的hash值是一个二进制字节串,我把这个字节串存到mysql的password字段,password字段的数据类型是varbinary. ...
- MSSQL 基础知识002
---启用sa账号 1. 先使用一个windows账号登陆. 2.在数据库实例上面右键,属性,安全性,登录名,sa. 右键,属性. 常规,修改sa的密码. 状态,启用sa账号. 主键的作用: 1.唯一 ...
- hibernate CasCade deleted object ould be re-saved by cascade
这个问题个人认为看你用的那种方式,如果是注解式的 比如: @ManyToMany(cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType. ...
- sqlmap tamper编写
#!/usr/bin/env python """ Copyright (c) 2006-2017 sqlmap developers (http://sqlmap.or ...
- flask基础之安装和使用入门(一)
前言 Flask框架作为一个python极简化的web框架,它不像Django那样的重型,非常适合快速开发一些小型的应用.本人用flask开发了几个项目之后,慢慢研究flask底层的一些原理,开始一步 ...
- 记一个多线程使用libevent的问题
前段时间使用libevent网络库实现了一个游戏服务器引擎,在此记录下其中遇到的一个问题. 我在设计服务器上选择把逻辑和网络分线程,线程之间通信使用队列.但是这样做会有个问题: 当逻辑线程想要主动的发 ...
- Java network programming-guessing game
猜数字游戏 游戏的规则如下: 当客户端第一次连接到服务器端时,服务器端生产一个[0,50]之间的随机数字,然后客户端输入数字来猜该数字,每次客户端输入数字以后,发送给服务器端,服务器端判断该客户端发送 ...
- 用C++写程序的一些感悟
前言 近期使用C++有了一些心得很感悟,这里整理一下. 心得1 如果只会使用LabVIEW写程序,还想要进一步深入程序设计,一定要学习一门文本语言. 什么是会用LabVIEW 会用是个比较笼统的概念. ...