HYSBZ 1415 - 聪聪和可可(概率DP)
http://vjudge.net/problem/viewProblem.action?id=20613
题意:不用说了,中文题。
这个题可以用概率DP来做。
题中要求猫抓到老鼠的时间期望。分析一下这个过程,如果猫在每单位时间里第一步移动没有抓到老鼠,它还可以继续移动一次。对于确定老鼠的位置,注意猫的每次移动都是固定的,而老鼠的移动位置却是不定的。
令dp[i][j]表示猫在i位置老鼠在j位置时,猫抓到老鼠的期望。next[i][j]表示猫从i位置到j位置时走最短路径需要移动到的第一个结点位置。d[i]表示结点i的度。
这样首先看猫的当前位置,如果i==j即猫和老鼠在同一个点,那么猫不用移动了这时候猫已经抓到了老师,dp[i][j]=0。
如果不等,考虑如果猫在这两次移动中抓到了老鼠,如果猫第一步移动到了老鼠当前所在位置,即next[i][j]==j,或者猫第二步移动抓到了老鼠,即next[next[i][j]][j]==j,此时所用时间都是1,dp[i][j]=1。
其他情况,考虑猫在该单位时间内没抓到老鼠,此时的状态转移取决于老鼠的行动。老鼠可以移动到任意一个和j结点相连的点,也可以停留在j点,每种情况发生的概率是1/(d[j]+1),每次转移到的状态即dp[next[next[i][j]][j]][k](k取值j,或与j点直接连边的点),运用全期望公式即可。
这样记忆化搜索可解。
其中计算next[][]的过程可以用bfs预处理。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define ll long long
#define MAXN 30005
using namespace std;
int n,m;
vector<];
][];
][];
][];
struct Point
{
int pos,from;
Point(,):pos(a),from(b) {}
};
void bfs(int sst)
{
]= {};
queue<Point> que;
que.push(Point(sst));
while(!que.empty())
{
Point q=que.front();
que.pop();
; i<gl[q.pos].size(); ++i)
{
if(vis[gl[q.pos][i]]) continue;
vis[gl[q.pos][i]]=true;
int f;
if(q.pos==sst) f=gl[q.pos][i];
else f=q.from;
que.push(Point(gl[q.pos][i],f));
next[sst][gl[q.pos][i]]=f;
}
}
}
double dp(int i,int j)
{
if(vis[i][j]) return f[i][j];
vis[i][j]=true;
int &p=next[i][j];
;
;
f[i][j]=;
; k<gl[j].size(); ++k)
f[i][j]+=dp(next[p][j],gl[j][k]);
f[i][j]+=dp(next[p][j],j);
f[i][j]/=(gl[j].size()+);
f[i][j]++;
return f[i][j];
}
int main()
{
scanf("%d%d",&n,&m);
int st,ed;
scanf("%d%d",&st,&ed);
; i<m; ++i)
{
int x,y;
scanf("%d%d",&x,&y);
gl[x].push_back(y);
gl[y].push_back(x);
}
; i<=n; ++i)
{
sort(gl[i].begin(),gl[i].end());
bfs(i);
}
memset(vis,,sizeof(vis));
printf("%.3lf\n",dp(st,ed));
;
}
HYSBZ 1415 - 聪聪和可可(概率DP)的更多相关文章
- BZOJ 1415 [NOI2005]聪聪与可可 (概率DP+dfs)
题目大意:给你一个无向联通图,节点数n<=1000.聪聪有一个机器人从C点出发向在M点的可可移动,去追赶并吃掉可可,在单位时间内,机器人会先朝离可可最近的节点移动1步,如果移动一步机器人并不能吃 ...
- 聪聪和可可 HYSBZ - 1415(概率 + spfa + 记忆化dp)
Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每 ...
- BZOJ 1415: [Noi2005]聪聪和可可( 最短路 + 期望dp )
用最短路暴力搞出s(i, j)表示聪聪在i, 可可在j处时聪聪会走的路线. 然后就可以dp了, dp(i, j) = [ dp(s(s(i,j), j), j) + Σdp(s(s(i,j), j), ...
- bzoj1415 [Noi2005]聪聪和可可【概率dp 数学期望】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1415 noip2016 D1T3,多么痛的领悟...看来要恶补一下与期望相关的东西了. 这是 ...
- 1415. [NOI2005]聪聪和可可【记忆化搜索DP】
Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点 ...
- bzoj 1415 [Noi2005]聪聪和可可——其实无环的图上概率
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1415 乍一看和“游走”一样.于是高斯消元.n^2状态,复杂度n^6…… 看看TJ,发现因为聪 ...
- BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs
BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...
- 概率/期望DP初步——BZOJ1415 聪聪和可可
期望相关: 数学期望,可以简单理解的加权平均数.设有一系列的值$x_i$,每个值被取到的概率为$p_i$,则期望$E=\sum\limits_{i=1}^n p_i x_i$. 期望具有线性性:$$E ...
- 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...
随机推荐
- jquery 全选功能
1.直接全选(复选框名字要统一) <input type="CHECKBOX" id="cbSelectAll" onclick="$('inp ...
- 修复 SQLite 数据库文件
目 录 第1章 说明 1 1 下载SQLite Tools 1 2 运行 2 第1章 说明 笔者编写的一个程序,无法往 SQLite 数据库文件里写数据.使用SQLiteSpy打开该 ...
- dede会员指定栏目发布文章
后台——核心——网站栏目管理——修改栏目——常规选项——支持投稿
- DI 之 3.1 DI的配置使用(肆)
3.1.1 依赖和依赖注入 传统应用程序设计中所说的依赖一般指"类之间的关系",那先让我们复习一下类之间的关系: 泛化:表示类与类之间的继承关系.接口与接口之间的继承关系: 实现 ...
- jmeter 使用URL重写处理用户会话
如果您的web应用程序使用URL重写而不是cookie保存会话信息, 那么你需要做一些额外的工作来测试你的网站. 正确应对URL重写,JMeter需要解析HTML 接收从服务器和检索独特的会话ID,使 ...
- AngularJS 中文资料+工具+库+Demo 大搜集
中文学习资料: 中文资料且成系统的就这么多,优酷上有个中文视频. http://www.cnblogs.com/lcllao/archive/2012/10/18/2728787.html 翻译的 ...
- R语言与正态性检验
1.Kolmogorov-Smirnov正态性检验 Kolmogorov-Smirnov是比较一个频率分布f(x)与理论分布g(x)或者两个观测值分布的检验方法,若两者间的差距很小,则推论该样本取自某 ...
- Qt之保持GUI响应
简述 Qter们经常遇到由于耗时操作造成GUI阻塞的问题.其实,这个问题并不难克服,可以采用许多不同的方式,下面我会列举一些可选范围,根据使用情况进行处理. 简述 执行耗时操作 手动事件处理 使用一个 ...
- Java并发编程:阻塞队列(转载)
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...
- IO流--文件处理
import java.io.*; public class io { public static void main(String[] args) { ListDemo(); File dir = ...