概率/期望DP初步——BZOJ1415 聪聪和可可
期望相关:
数学期望,可以简单理解的加权平均数。设有一系列的值$x_i$,每个值被取到的概率为$p_i$,则期望$E=\sum\limits_{i=1}^n p_i x_i$。
期望具有线性性:$$E(aX+bY)=aE(X)+bE(Y)$$ $$E(XY)=E(X)E(Y)$$ 大概就是说求期望的时候正着反着乱序着乱搞求出来的都是对的。。。
基于期望的线性性,我们可以在概率和期望之间建立一定的递推关系,这样就可以通过动态规划来解决一些概率问题。
比如NOI2005的聪聪和可可。
题目大意:给定一个无向图,聪聪在起点,可可在终点,每个时刻聪聪会沿最短路走向可可两步(如果有多条最短路走编号最小的点),然后可可会等概率向周围走或不动,求平均多少个时刻后聪聪和可可相遇。
设聪聪在节点$x$,可可在节点$y$
设$f[u][v]$为聪聪在$u$可可在$v$时聪聪抓住可可的期望时间,$p[u][v]$为为聪聪在$u$可可在$v$时聪聪下一步会到达的节点,$degree[v]$为节点$v$的度;
显然,当$x=y$时$f[x][y]=0$;当$0<dis[x][y] \leqslant 2$时$f[x][y]=1$。
当$dis[x][y]>2$时,$$f[x][y]=\frac{f[p[x][y]][y]+\sum\limits_{e(y,k)} f[p[x][y]][k]}{degree[x]+1}$$
对每个节点进行一次SPFA求出p[][]
然后根据上述状态转移方程记忆化搜索就好。
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
#define foru(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int N=1e4+;
struct edge{int to,nxt;}e[N*];
queue<int> q;
int head[N],vis[N],d[N],ne,n,m,s,t,p[][];
double f[][];
void add(int a,int b){e[++ne]=(edge){b,head[a]};head[a]=ne;}
void spfa(int x){
memset(d,,sizeof(d));
memset(vis,,sizeof(vis));
q.push(x);d[x]=;vis[x]=;
while(!q.empty()){
int k=q.front();q.pop();
vis[k]=;
for(int i=head[k];i;i=e[i].nxt){
int v=e[i].to;
if(d[v]>d[k]+||(d[v]==d[k]+&&k<p[v][x])){
d[v]=d[k]+;
p[v][x]=k;
if(!vis[v]){
q.push(v);
vis[v]=;
}
}
}
}
} double dfs(int x,int y){
if(f[x][y]!=-)return f[x][y];
if(x==y){f[x][y]=;return ;}
if(p[x][y]==y||p[p[x][y]][y]==y){f[x][y]=;return ;};
f[x][y]=dfs(p[p[x][y]][y],y);int d=;
for(int i=head[y];i;i=e[i].nxt){
d++;
int v=e[i].to;
f[x][y]+=dfs(p[p[x][y]][y],v);
}
(f[x][y]/=d+);
f[x][y]+=;
return f[x][y];
} int main(){
int u,v;
scanf("%d%d",&n,&m);
scanf("%d%d",&s,&t);
foru(i,,m){
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
foru(i,,n)foru(j,,n)f[i][j]=-;
foru(i,,n)spfa(i);
double ans=dfs(s,t);
printf("%.3lf\n",ans);
return ;
}
DP一直是弱项,总是找不到套路,还是多做点题吧。
概率/期望DP初步——BZOJ1415 聪聪和可可的更多相关文章
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp
题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...
- 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp
题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...
- Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp
一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...
- 概率期望dp
对于概率dp,我一直都弄得不是特别明白,虽然以前也有为了考试去突击过,但是终究还是掌握得不是很好,所以决定再去学习一遍,把重要的东西记录下来. 1.hdu4405 Description 在一个 \( ...
- Codeforces 908 D.New Year and Arbitrary Arrangement (概率&期望DP)
题目链接:New Year and Arbitrary Arrangement 题意: 有一个ab字符串,初始为空. 用Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾 ...
- [BZOJ4832]抵制克苏恩(概率期望DP)
方法一:倒推,最常规的期望DP.f[i][a][b][c]表示还要再攻击k次,目前三种随从个数分别为a,b,c的期望攻击英雄次数,直接转移即可. #include<cstdio> #inc ...
- 期望DP初步
感觉期望DP这种东西像是玄学- 主要总结说一点基础性的东西, 或许对于理解题目的做法会有一点帮助. 首先是关于独立事件, 互斥事件的概念. 通俗地说, 就是对于两个事件A, B, 假如满足发生了其中一 ...
- LightOJ 1030 Discovering Gold (概率/期望DP)
题目链接:LightOJ - 1030 Description You are in a cave, a long cave! The cave can be represented by a \(1 ...
随机推荐
- springboot rabbitmq消息同步用作接口调用
1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- pywin32获得tkinter窗口句柄,并在上面绘图
想实现用win32 API在tkinter窗口上画图,那么应该先获得tkinter窗口的句柄hwnd,然后再获得tkinter的设备hdc.尝试了FindWindow(),GetActiveWindo ...
- Thread--lock,lockInterruptibly,tryLock,tryLock(long timeout, TimeUnit unit)
参考:http://www.dewen.net.cn/q/9077 http://coolxing.iteye.com/blog/1236909 lock,tryLock,lockInterrupti ...
- bzoj4311向量(线段树分治+斜率优化)
第二道线段树分治. 首先设当前向量是(x,y),剩余有两个不同的向量(u1,v1)(u2,v2),假设u1>u2,则移项可得,若(u1,v1)优于(u2,v2),则-x/y>(v1-v2) ...
- CMake常用变量
CMake变量 CMake共用七种变量,如下所示: 目录: ()提供信息的变量. ()控制变量. ()描述系统的变量. ()控制构建过程的变量. ()语言变量. ()CTest变量. (7)CPack ...
- Java自学-泛型 泛型转型
Java 中的子类泛型转型成父类泛型 步骤 1 : 对象转型 根据面向对象学习的知识,子类转父类 是一定可以成功的 package generic; import charactor.ADHero; ...
- FJ的字符串-简单递归
FJ的字符串-简单递归 问题描述FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACABA” A4 = “ABACABADABACABA” … … 你能找出其 ...
- Unity中的事件监听
Unity3D的uGUI系统的将UI可能触发的事件分为12个类型,即EventTriggerType枚举的12个值.如下图所示: 先以PointerClick为例.这个是用于某点点击事件.其他事件都可 ...
- Xpath编码问题解决
使用Xpath获取属性时,出现乱码问题,解决办法找了好多,终于解决,特将办法贴在这,供大家尝试 不要直接简单的将爬取的网页设置为utf-8, 先通过print(r.encoding)输出看看爬取的是什 ...
- Web前端学习方向
第一部分 HTML 第一章 职业规划和前景 职业方向规划定位: web前端开发工程师 web网站架构师 自己创业 转岗管理或其他 web前端开发的前景展望: 未来IT行业企业需求最多的人才 结合最新的 ...