期望相关:

  数学期望,可以简单理解的加权平均数。设有一系列的值$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 聪聪和可可的更多相关文章

  1. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

  2. 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp

    题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...

  3. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

  4. Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp

    一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...

  5. 概率期望dp

    对于概率dp,我一直都弄得不是特别明白,虽然以前也有为了考试去突击过,但是终究还是掌握得不是很好,所以决定再去学习一遍,把重要的东西记录下来. 1.hdu4405 Description 在一个 \( ...

  6. Codeforces 908 D.New Year and Arbitrary Arrangement (概率&期望DP)

    题目链接:New Year and Arbitrary Arrangement 题意: 有一个ab字符串,初始为空. 用Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾 ...

  7. [BZOJ4832]抵制克苏恩(概率期望DP)

    方法一:倒推,最常规的期望DP.f[i][a][b][c]表示还要再攻击k次,目前三种随从个数分别为a,b,c的期望攻击英雄次数,直接转移即可. #include<cstdio> #inc ...

  8. 期望DP初步

    感觉期望DP这种东西像是玄学- 主要总结说一点基础性的东西, 或许对于理解题目的做法会有一点帮助. 首先是关于独立事件, 互斥事件的概念. 通俗地说, 就是对于两个事件A, B, 假如满足发生了其中一 ...

  9. LightOJ 1030 Discovering Gold (概率/期望DP)

    题目链接:LightOJ - 1030 Description You are in a cave, a long cave! The cave can be represented by a \(1 ...

随机推荐

  1. 如何向女朋友介绍MySQL索引

    目录 一.前言 二.正文 三.索引的类型 四.动态查找树 五.B-Tree 1.B-Tree特征 2.B-Tree的查找(select) 3.B-Tree的插入(insert) 4.B-Tree的删除 ...

  2. RaspBerry--解决无法用 ssh 直接以 root 用户登录

    参考:https://www.cnblogs.com/xwdreamer/p/6604593.html 以普通用户登录,然后切换至 root 用户. 编辑 /etc/ssh/sshd_config 添 ...

  3. I420转RGB

    http://blog.csdn.net/huiguixian/article/details/17288909 public class YuvToRGB { private static int  ...

  4. 吴裕雄--天生自然 PHP开发学习:表单 - 必需字段

    <?php // 定义变量并默认设为空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $ema ...

  5. springboot的http监控接口启动器的配置

    基于SpringBoot框架企业级应用系统开发全面实战()->03.07_http监控_recv.mp4 监控接口启动器 自定义监控接口启动器的配置 ====================== ...

  6. 黑马IDEA版javaweb_2-2MySQL

    今日内容 数据库的基本概念 MySQL数据库软件 安装 卸载 配置 SQL 数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB 2. 什么数据库? * 用于存储和管理数据的仓 ...

  7. python使用进程池多进程时,如何打印错误信息

    一.说明 1.python进程池进行多进程运行时,如果有错误,该进程会直接跳过,并且不会打印错误信息. 2.如果需要了解到进程内的错误信息,此时就需要通过捕获异常来输出错误信息了. 二.具体方法如下: ...

  8. 单个body|简单解释|复杂解释|反面解释

    单个body有三种方法简单解释.复杂解释和反面解释 ========================================================================== ...

  9. vector内部实现2

    push_back 往动态数组的内部进行添加数据 pop_back 往动态数组的尾部进行删除数据 resize  讲元素的数量len改成num个数量  如果size()变大了,多出来的将用默认构造来创 ...

  10. HTML字符实体和转义字符串大全

    转义字符串的组成 转义字符串(Escape Sequence),即字符实体(Character Entity)分成三部分:第一部分是一个&符号,英文叫ampersand:第二部分是实体(Ent ...