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来做. 题中要求猫抓到老鼠的时间期望.分析一下 ...
随机推荐
- Python :集合类型(set)
set 是一个无序的元素集合,支持并.交.差及对称差等数学运算, 但由于 set 不记录元素位置,因此不支持索引.分片等序列的操作. 一.初始化 s0 = set() d0 = {} s1 = {0} ...
- Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅
在上一篇Spring中使用JdbcTemplate访问数据库中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端 ...
- $.when()方法翻译2
mac不知道为何,文章字数一多,浏览器就重启.只好分开写了. In the event a Deferred was resolved with no value, the corresponding ...
- TinyOS在ubuntu 14.04下安装教程
1:打开/etc/apt/sources.list 文件,在文件最底部添加安装源: deb http://tinyos.stanford.edu/tinyos/dists/ubuntu lucid m ...
- pythonif语句和循环语句
1.if语句用法 # if语句用法(缩进相同的成为一个代码块) score=90 if score>=60: print("合格") print("OK" ...
- 64_o1
OCE-devel-0.18.1-1.fc26.i686.rpm 15-May-2017 18:37 5634474 OCE-devel-0.18.1-1.fc26.x86_64.rpm 15-May ...
- linux用户修改用户shell
要拒绝系统用户登录,可以将其shell设置为/usr/sbin/nologin或者/bin/false # usermod -s /usr/sbin/nologin username 或者 # use ...
- Java Web 远程调试
Java Web 远程 调试 Tomcat 下载压缩版服务器 环境:Tomcat.Eclipse,做远程调试我们并不需要其他特殊插件 1.配置Tomcat/bin/startup.bat 在前面增加代 ...
- ftp--vsftp\pureftpd
FTP是File Transfer Protocol(文件传输协议),用于Internet上的控制文件的双向传输. 现今常用在一个局域网内,如学校.公司等一个指定范围的区域.(因为太过于简单和不安全) ...
- Linux上java环境变量配置
1.java配置 配置环境变量在/etc/profile下增加 # set Java environment JAVA_HOME=/usr/share/jdk1.6.0_43 PATH=$JAVA_H ...