bzoj1415 [Noi2005]聪聪和可可【概率dp 数学期望】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1415
noip2016 D1T3,多么痛的领悟。。。看来要恶补一下与期望相关的东西了。
这是一道经典的求期望的题,尽管我的代码里把那个记忆化搜索那个叫做dp,但事实上这不是动态规划,只是递推。
先预处理出x[i][j],表示聪聪在i,可可在j时,下一步聪聪到达的顶点标号,f[i][j]是那张记忆化搜索的表,表示聪聪在i,可可在j时,期望所需的时间,out[i]表示i点的出度(其实就是度啦,无向图没什么入度出度的)。显然,下一个单位时间聪聪的位置是x[x[i][j]][j],而可可是在所有与j相邻的节点或者j自己中随机挑一个到达,每个的概率都是1 / (out[j] + 1),所以有
f[i][j] = ( sigma( f[x[x[i][j]][j]][k] ) + f[x[x[i][j]][j]][j] ) / (out[j] + 1) + 1,其中k表示每个与j相邻的节点。
然后写一个记忆化搜索就完事咯~
#include <cstdio>
#include <cstring> const int maxn = 1005, maxe = 1005; int n, e, ini_neko, ini_mouse, t1, t2;
int head[maxn], to[maxe << 1], next[maxe << 1], lb, out[maxn];
int que[maxn], head_, tail, h, x[maxn][maxn], d[maxn][maxn];
double f[maxn][maxn]; inline void ist(int aa, int ss) {
to[lb] = ss;
next[lb] = head[aa];
head[aa] = lb;
++out[aa];
++lb;
}
double dp(int i, int j) {
if (f[i][j] != -1.0) {
return f[i][j];
}
if (i == j) {
return f[i][j] = 0.0;
}
if (x[i][j] == j) {
return f[i][j] = 1.0;
}
if (x[x[i][j]][j] == j) {
return f[i][j] = 1.0;
}
f[i][j] = 0.0;
for (int k = head[j]; k != -1; k = next[k]) {
f[i][j] += dp(x[x[i][j]][j], to[k]);
}
f[i][j] = (f[i][j] + dp(x[x[i][j]][j], j)) / (double)(out[j] + 1) + 1;
return f[i][j];
} int main(void) {
//freopen("in.txt", "r", stdin);
memset(head, -1, sizeof head);
memset(next, -1, sizeof next);
for (int i = 0; i < maxn; ++i) {
for (int j = 0; j < maxn; ++j) {
f[i][j] = -1.0;
}
}
scanf("%d%d", &n, &e);
scanf("%d%d", &ini_neko, &ini_mouse);
while (e--) {
scanf("%d%d", &t1, &t2);
ist(t1, t2);
ist(t2, t1);
} memset(d, -1, sizeof d);
for (int i = 1; i <= n; ++i) {
memset(que, 0, sizeof que);
head_ = tail = 0;
que[tail++] = i;
d[i][i] = 0;
while (head_ != tail) {
h = que[head_++];
for (int j = head[h]; j != -1; j = next[j]) {
if (d[i][to[j]] == -1) {
d[i][to[j]] = d[i][h] + 1;
que[tail++] = to[j];
}
}
}
} memset(x, 0x3c, sizeof x);
for (int i = 1; i <= n; ++i) {
for (int k = head[i]; k != -1; k = next[k]) {
for (int j = 1; j <= n; ++j) {
if (d[i][j] == d[to[k]][j] + 1 && x[i][j] > to[k]) {
x[i][j] = to[k];
}
}
}
} printf("%.3f\n", dp(ini_neko, ini_mouse));
return 0;
}
bzoj1415 [Noi2005]聪聪和可可【概率dp 数学期望】的更多相关文章
- CF 148D D. Bag of mice (概率DP||数学期望)
The dragon and the princess are arguing about what to do on the New Year's Eve. The dragon suggests ...
- [hdu4089] Activation【概率dp 数学期望】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4089 本来可以一遍过的,结果mle了一发...注意要用滚动数组. 令f(i, j)表示队列剩余i个人,这 ...
- [poj3744] Scout YYF I【概率dp 数学期望】
传送门:http://poj.org/problem?id=3744 令f(i)表示到i,安全的概率.则f(i) = f(i - 1) * p + f(i - 2) * (1 - p),若i位置有地雷 ...
- [poj2096] Collecting Bugs【概率dp 数学期望】
传送门:http://poj.org/problem?id=2096 题面很长,大意就是说,有n种bug,s种系统,每一个bug只能属于n中bug中的一种,也只能属于s种系统中的一种.一天能找一个bu ...
- [hdu4035] Maze【概率dp 数学期望】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4035 真的是一道好题,题解比较麻烦,我自己在纸上写了好大一块草稿才搞出来,不用公式编辑器的话就很难看清楚 ...
- HDU3853-LOOPS(概率DP求期望)
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others) Total Su ...
- BZOJ 1415 [NOI2005]聪聪与可可 (概率DP+dfs)
题目大意:给你一个无向联通图,节点数n<=1000.聪聪有一个机器人从C点出发向在M点的可可移动,去追赶并吃掉可可,在单位时间内,机器人会先朝离可可最近的节点移动1步,如果移动一步机器人并不能吃 ...
- poj 2096 Collecting Bugs (概率dp 天数期望)
题目链接 题意: 一个人受雇于某公司要找出某个软件的bugs和subcomponents,这个软件一共有n个bugs和s个subcomponents,每次他都能同时随机发现1个bug和1个subcom ...
- zoj 3822 Domination (概率dp 天数期望)
题目链接 参考博客:http://blog.csdn.net/napoleon_acm/article/details/40020297 题意:给定n*m的空棋盘 每一次在上面选择一个空的位置放置一枚 ...
随机推荐
- HDOJ 5416 CRB and Tree DFS
CRB and Tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- Excel中MATCH函数的正确使用
Excel中MATCH函数是一个很强大的辅助函数, MATCH函数语法为:MATCH(lookup_value,lookuparray,match-type) lookup_value:表示查询的指定 ...
- 怎样解读Caffe源代码
怎样解读Caffe源代码 导读 Caffe是如今非常流行的深度学习库,能够提供高效的深度学习训练.该库是用C++编写.能够使用CUDA调用GPU进行加速.可是caffe内置的工具不一定能够满足用户的全 ...
- linux 中安装JDK
一般公司差点儿相同全部的server都是搭建在Linux上面的,所以这就免不了.(要是使用Java语言)要在Linux上面布一套JDK也就是Java虚拟机环境. 以下.我详细说一下安装过程,以及可能出 ...
- hdu5399Too Simple
//给m个函数 //其相应是自变量x属于{1,2,...n} //f(x)属于{1,2...3} //给出当中一些函数,问有多少种不同的函数集合使得 //1<=i<=n f1(f2(f3. ...
- Android 项目导入常见错误
1.SDK版本号不正确应,你能够打开你项目中的project.properties文件,改动target=android-18(我这是18) ,将18改 为14(其它都能够),再改回18会又一次载入. ...
- 理解Android进程创建流程(转)
/frameworks/base/core/java/com/android/internal/os/ - ZygoteInit.java - ZygoteConnection.java - Runt ...
- android JNI 资料大全
AndroidJNI 通过C++调用JAVA 1. JNIEnv对象 对于本地函数 JNIEXPORT void JNICALL Java_video1_TestNative_sayHel ...
- 机器学习笔记之PCA-SIFT总结
不多说,直接上干货! PCA-SIFT算法在描述子构建上作了创新,主要是 将统计学中的主成分分析(PCA)应用于对描述子向量的降维,以提高匹配效率 . PCA 的原理是:一般有效信号的方差大,噪声的方 ...
- js的几种循环语句
//js种的循环语句 //while与do while的区别是while是满足条件后才执行 //do while是不管满不满足条件都会执行一次 //for 循环与while,do while相比循环结 ...