【bzoj1415】【聪聪和可可】期望dp(记忆化搜索)+最短路
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57148470
Descrition
首先很明显是期望dp。但是如何进行转移呢?
对于dp,什么样的状态容易储存呢?怎样又分解成相应的子问题呢?于是发现,对于这个问题,我们需要知道猫的位置到老鼠位置的期望值。与这样的相似的状态有很多。观察数据范围,是可以用二维数组存下的。所以我们用f[i][j]表示猫在i点,老鼠在j点的答案。
转移方程:
f[i][j]=sigma(f[i’][j’]*1/(degree[j]+1))+1
i’表示猫在i会移动到的下一个景点(因为是猫先动,所以i’可以直接算出来),j’表示j的后继状态们(老鼠可以到达的点和当前点)
然而对于这样的方程要怎么递推呢?死都没想出来。直到看了网上的题解才想起dp还有记忆化搜索的类型。
对于如何在已知猫和老鼠的位置,确定猫的下一步走法?用最短路就好了,顺带处理一下d[i][j]的值(表示猫在i老鼠在j的猫的下一步)。我比较喜欢用spfa
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000+5;
int n,e,st,ed;
int p[N][N],dis[N],deg[N];
double f[N][N];
bool exi[N];
int head[N],end[N*2],nxt[N*2],hh=0;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
void adde(int a,int b){
hh++;
end[hh]=b;
nxt[hh]=head[a];
head[a]=hh;
}
void spfa(int x){
memset(dis,0x3f,sizeof(dis));
memset(exi,0,sizeof(exi));
while(!q.empty()) q.pop();
p[x][x]=x;
dis[x]=0;
for(int i=head[x];i;i=nxt[i]){
int v=end[i];
p[x][v]=v;
dis[v]=1;
q.push(make_pair(1,v));
exi[v]=1;
}
while(!q.empty()){
int u=q.top().second;q.pop();
exi[u]=0;
for(int i=head[u];i;i=nxt[i]){
int v=end[i];
if(dis[v]>=dis[u]+1){
if(dis[v]==dis[u]+1) p[x][v]=min(p[x][u],p[x][v]);
else p[x][v]=p[x][u];
dis[v]=dis[u]+1;
if(!exi[v]){
q.push(make_pair(dis[v],v));
exi[v]=1;
}
}
}
}
}
double dfs(int cat,int mice){
if(f[cat][mice]!=-1) return f[cat][mice];
if(p[p[cat][mice]][mice]==mice) return f[cat][mice]=1;
double ans=0;
int cc=p[p[cat][mice]][mice];
for(int i=head[mice];i;i=nxt[i]){
int v=end[i];
if(v==cc) continue;
ans+=dfs(cc,v)/(deg[mice]+1);
}
ans+=dfs(cc,mice)/(deg[mice]+1)+1;
return f[cat][mice]=ans;
}
int main(){
scanf("%d%d%d%d",&n,&e,&st,&ed);
int a,b;
for(int i=1;i<=e;i++){
scanf("%d%d",&a,&b);
adde(a,b),adde(b,a);
deg[a]++,deg[b]++;
}
for(int i=1;i<=n;i++) spfa(i);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) f[i][j]=-1;
printf("%.3lf\n",dfs(st,ed));
return 0;
}
【bzoj1415】【聪聪和可可】期望dp(记忆化搜索)+最短路的更多相关文章
- 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...
- bzoj 1415: [Noi2005]聪聪和可可 期望dp+记忆化搜索
期望dp水题~ 你发现每一次肯定是贪心走 2 步,(只走一步的话就可能出现环) 然后令 $f[i][j]$ 表示聪在 $i$,可在 $j$,且聪先手两个人碰上面的期望最小次数. 用记忆化搜索转移就行了 ...
- luogu P4206 [NOI2005]聪聪与可可 期望dp 记忆化搜索
LINK:聪聪与可可 这道题的核心是 想到如何统计答案. 如果设f[i][j]表示第i个时刻... 可以发现还需要统计位置信息 以及上一次到底被抓到没有的东西 不太好做. 两者的位置都在变化 所以需要 ...
- 洛谷4206/NOI2005T4 聪聪和可可 期望DP+记忆化搜索
题意:给出n个点m条边的无向图,两个主角聪聪和可可开始分别在S点和T点.聪聪想吃掉可可,每次由匆匆先行动后来可可行动.聪聪的行动是选他到可可的最短路上的点走最多两步(如果最短路有几条就选编号最小的走) ...
- BZOJ1415 [Noi2005]聪聪和可可 【SPFA + 期望dp记忆化搜索】
题目 输入格式 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...
- [CH3803] 扑克牌 (期望DP+记忆化搜索)
[题目链接] [CH3803] 扑克牌 [题面描述] \(54\)张牌,每次随机摸一张,求得到 A张黑桃 B张红桃 C张梅花 D张方块 的期望步数.特别地,大王和小王可以当做任意一种花色,当然,会选择 ...
- bzoj 1415 期望dp + 记忆化搜索
思路:这个题看着感觉不能dp,其实是可以dp的,因为狼每次走两步,兔子每次走一步,每进行一轮以后,狼和兔子的距离 肯定是在接近的,没有相同的状态,dp之前预处理出来,每一步狼该往哪里走. #inclu ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
随机推荐
- 孤荷凌寒自学python第三十天python的datetime.datetime模块
孤荷凌寒自学python第三十天python的datetime.datetime模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.datetime模块包含了:datet ...
- 孤荷凌寒自学python第二十九天python的datetime.time模块
孤荷凌寒自学python第二十九天python的datetime.time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.time模块是专门用来表示纯时间部分的类. ...
- 史林枫:开源HtmlAgilityPack公共小类库封装 - 网页采集(爬虫)辅助解析利器【附源码+可视化工具推荐】
做开发的,可能都做过信息采集相关的程序,史林枫也经常做一些数据采集或某些网站的业务办理自动化操作软件. 获取目标网页的信息很简单,使用网络编程,利用HttpWebResponse.HttpWebReq ...
- 有向图强连通分量Tarjan算法
在https://www.byvoid.com/zhs/blog/scc-tarjan中关于Tarjan算法的描述非常好,转述如下: 首先解释几个概念: 有向图强连通分量:在有向图G中,如果两个顶点间 ...
- 内存检测工具valgrind
valgrind --tool=memcheck --leak-check=full --error-limit=no --trace-children=yes ./server valgrind ...
- CSLM 配置粗解
CSLM工具(continuous space language model toolkit)用于训练NNLM,支持SRILM.KENLM(默认)语言模型工具,CUDA加速,CSTM统计机器翻译. 本 ...
- P1023 税收与补贴问题
题目背景 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递 ...
- [bzoj4712] 洪水 [树链剖分+线段树+dp]
题面 传送门 思路 DP方程 首先,这题如果没有修改操作就是sb题,dp方程如下 $dp[u]=max(v[u],max(dp[v]))$,其中$v$是$u$的儿子 我们令$g[u]=max(dp[v ...
- altera ip 核小究
用quartus的MegaWizard工具生成一个乘法器multiplier,会在工程目录下产生 multiplier.qip (可选) multiplier_bb.v (可选) multip ...
- python登录qq
登录qq的用的是get方法, 首先抓login_sig(某个包中的cookie),接着验证码的包(包含对验证码的校验),,最后计算一个p的加密算法,接着再get请求一个链接 https://ssl.p ...