期望相关:

  数学期望,可以简单理解的加权平均数。设有一系列的值$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. springboot rabbitmq消息同步用作接口调用

    1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  2. pywin32获得tkinter窗口句柄,并在上面绘图

    想实现用win32 API在tkinter窗口上画图,那么应该先获得tkinter窗口的句柄hwnd,然后再获得tkinter的设备hdc.尝试了FindWindow(),GetActiveWindo ...

  3. 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 ...

  4. bzoj4311向量(线段树分治+斜率优化)

    第二道线段树分治. 首先设当前向量是(x,y),剩余有两个不同的向量(u1,v1)(u2,v2),假设u1>u2,则移项可得,若(u1,v1)优于(u2,v2),则-x/y>(v1-v2) ...

  5. CMake常用变量

    CMake变量 CMake共用七种变量,如下所示: 目录: ()提供信息的变量. ()控制变量. ()描述系统的变量. ()控制构建过程的变量. ()语言变量. ()CTest变量. (7)CPack ...

  6. Java自学-泛型 泛型转型

    Java 中的子类泛型转型成父类泛型 步骤 1 : 对象转型 根据面向对象学习的知识,子类转父类 是一定可以成功的 package generic; import charactor.ADHero; ...

  7. FJ的字符串-简单递归

    FJ的字符串-简单递归 问题描述FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACABA” A4 = “ABACABADABACABA” … … 你能找出其 ...

  8. Unity中的事件监听

    Unity3D的uGUI系统的将UI可能触发的事件分为12个类型,即EventTriggerType枚举的12个值.如下图所示: 先以PointerClick为例.这个是用于某点点击事件.其他事件都可 ...

  9. Xpath编码问题解决

    使用Xpath获取属性时,出现乱码问题,解决办法找了好多,终于解决,特将办法贴在这,供大家尝试 不要直接简单的将爬取的网页设置为utf-8, 先通过print(r.encoding)输出看看爬取的是什 ...

  10. Web前端学习方向

    第一部分 HTML 第一章 职业规划和前景 职业方向规划定位: web前端开发工程师 web网站架构师 自己创业 转岗管理或其他 web前端开发的前景展望: 未来IT行业企业需求最多的人才 结合最新的 ...