期望 概率DP
期望
\(x\) 的期望 \(E(x)\) 表示平均情况下 \(x\) 的值。
令 \(C\) 表示常数, \(X\) 和 \(Y\) 表示两个随机变量。
\(E(C)=C\)
\(E(C \times X)=C \times E(X)\)
\(E(X+Y)=E(X)+E(Y)\) 期望的线性性
\(E(XY)\) 不一定等于 \(E(X) \times E(Y)\)
期望练习:
题意:
\(n\) 个格子从左往右排成一排,\(m\) 次操作。
每次操作随机选择一个区间 \([l,r]\) ,将里面所有格子涂黑。
求 \(m\) 次操作完毕后,被涂黑的格子数量的期望。
\(solution\):
期望的线性性,答案等于每个格子被涂黑的概率之和。
对于某个格子,假设一次操作涂黑它的概率为 \(p\) ,则 \(m\) 次操作涂黑它的概率为 \(1-(1-p)^m\)。
期望(概率)DP
题意:
\(n\) 个点 \(m\) 条边的有向无环图,保证 \(1\) 可以到达每个点,且每个点可以到达 \(n\) 号点。如果现在在 \(x\) ,\(x\) 连了 \(d\) 条边出去,那么会以 \(\dfrac{1}{d}\) 的概率随机选择一条边走过去。
求 \(1\) 游走到 \(n\) 的期望步数。
$n \le 100000 $ ,\(m \le 200000\)
\(solution\) :
记忆化搜索。
设 \(e[x]\) 表示 \(x\) 走到 \(n\) 的期望步数。
\]
\]
复杂度:\(O(n + m)\) 。
$\texttt{code}$
void dfs(ll x)
{
if(dp[x]!=-1) return;
ll cnt=0;
for(ll i=hea[x];i;i=nex[i])
{
dfs(ver[i]);
cnt+=dp[ver[i]];
}
dp[x]=(cnt*inv[x]+1)%mod;
}
for(ll i=1;i<=m;i++)
{
u=rd(),v=rd();
add(u,v),outd[u]+=1;
}
for(ll i=1;i<=n;i++) inv[i]=Pow(outd[i],mod-2);
dfs(1);
printf("%lld\n",dp[1]);
题意:
\(n\) 个点 \(m\) 条边的有向无环图,保证 \(1\) 可以到达每个点,且每个点可以到达 \(n\) 号点。如果现在在 \(x\) ,\(x\) 连了 \(d\) 条边出去,那么会以 \(\dfrac{1}{d+1}\) 的概率随机选择一条边走过去,或者以 \(\dfrac{1}{d+1}\) 的概率待在 \(x\) 点不动。
求 \(1\) 游走到 \(n\) 的期望步数。
\(n \le 100000\) ,\(m \le 200000\)
\(solution\) :
\]
有 \(e[x]\) 怎么办?化简!
\]
\]
结论:
\]
复杂度:\(O(n+m)\) 。
$\texttt{code}$
void dfs(ll x)
{
if(dp[x]!=-1) return;
ll cnt=0;
for(ll i=hea[x];i;i=nex[i])
{
dfs(ver[i]);
cnt+=dp[ver[i]];
}
dp[x]=(cnt+outd[x]+1)*inv[x]%mod;
}
for(ll i=1;i<=m;i++)
{
u=rd(),v=rd();
add(u,v),outd[u]+=1;
}
for(ll i=1;i<=n;i++) inv[i]=Pow(outd[i],mod-2);
dfs(1);
printf("%lld\n",dp[1]);
题意:
\(n\) 个点 \(m\) 条边的有向无环图,保证 \(1\) 可以到达每个点,且每个点可以到达 \(n\) 号点。如果现在在 \(x\) ,\(x\) 连了 \(d\) 条边出去,那么会以 \(\dfrac{1}{d+1}\) 的概率随机选择一条边走过去,或者以 \(\dfrac{1}{d+1}\) 的概率回到 \(1\) 号点。
求 \(1\) 游走到 \(n\) 的期望步数。
\(n \le 100000\) ,\(m \le 200000\)
\(solution\) :
\]
有 \(e[1]\) 怎么办?另外定义转移方程!
设:
\]
则有:
\]
带入转移方程式:
\]
\]
\]
\]
因为 \(e[x]=f[x] * e[1]+g[x]\) ,所以最终可以得出结论:
\]
\]
\]
带入求值即可。
$\texttt{code}$
void dfs(ll x)
{
if(f[x]!=-1) return;
ll cntf=0,cntg=0;
for(ll i=hea[x];i;i=nex[i])
{
dfs(ver[i]);
cntf+=f[ver[i]];
cntg+=g[ver[i]];
}
f[x]=(cntf+1)*inv[x]%mod;
g[x]=(cntg*inv[x]%mod+1ll)%mod;
}
for(ll i=1;i<=m;i++)
{
u=rd(),v=rd();
add(u,v),outd[u]+=1;
}
for(ll i=1;i<=n;i++) inv[i]=Pow(outd[i]+1,mod-2);
dfs(1);
printf("%lld\n",g[1]*Pow(((1-f[1]+mod)%mod+mod)%mod,mod-2)%mod);
其他习题
P1850 换教室
状态:设 \(dp[i][j][0/1]\) 来表示当前为第 \(i\) 个阶段,连同这一次已经用了 \(j\) 次换教室的机会,当前这次换 \((1)\) 不换 \((0)\) 的最小期望路程总和。
转移:
- 转移 \(dp[i][j][0]\) :
dp[i][j][0]=fmin
(
dp[i-1][j][0] + dis[c[i-1]][c[i]],
dp[i-1][j][1] + p[i-1]*dis[d[i-1]][c[i]] + (1.0-p[i-1])*dis[c[i-1]][c[i]]
);
- 转移 \(dp[i][j][1]\) :
dp[i][j][1]=fmin
(
dp[i-1][j-1][0] + p[i]*dis[c[i-1]][d[i]] + (1-p[i])*dis[c[i-1]][c[i]],
dp[i-1][j-1][1] +
p[i-1]*p[i]*dis[d[i-1]][d[i]] + p[i-1]*(1-p[i])*dis[d[i-1]][c[i]] +
(1-p[i-1])*p[i]*dis[c[i-1]][d[i]] + (1-p[i-1])*(1-p[i])*dis[c[i-1]][c[i]]
);
难点:因为在上一次换教室时是 概率 交换,所以不一定会换,所以要把两种情况的都加上(上面写了)。
$\texttt{code}$
memset(dis,inf,sizeof(dis));
for(int i=1;i<=v;i++) dis[i][i]=0;
int x,y,eg;
for(int i=1;i<=e;i++) x=rd(),y=rd(),eg=rd(),dis[x][y]=dis[y][x]=min(dis[x][y],eg);
for(int k=1;k<=v;k++) for(int i=1;i<=v;i++) for(int j=1;j<=v;j++)
dis[i][j]=dis[j][i]=min(dis[i][j],dis[i][k]+dis[k][j]);
for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) for(int k=0;k<=1;k++) dp[i][j][k]=1.0*inf;
dp[1][0][0]=dp[1][1][1]=0;
for(int i=2;i<=n;i++)
{
for(int j=0;j<=min(i,m);j++)
{
dp[i][j][0]=fmin
(
dp[i-1][j][0] + dis[c[i-1]][c[i]],
dp[i-1][j][1] + p[i-1]*dis[d[i-1]][c[i]] + (1.0-p[i-1])*dis[c[i-1]][c[i]]
);
if(j!=0) dp[i][j][1]=fmin
(
dp[i-1][j-1][0] + p[i]*dis[c[i-1]][d[i]] + (1-p[i])*dis[c[i-1]][c[i]],
dp[i-1][j-1][1] +
p[i-1]*p[i]*dis[d[i-1]][d[i]] + p[i-1]*(1-p[i])*dis[d[i-1]][c[i]] +
(1-p[i-1])*p[i]*dis[c[i-1]][d[i]] + (1-p[i-1])*(1-p[i])*dis[c[i-1]][c[i]]
);
}
}
ans=1.0*inf;
for(int j=0;j<=m;j++) for(int k=0;k<=1;k++) ans=fmin(ans,dp[n][j][k]);
printf("%.2lf\n",ans);
P3750 [六省联考2017]分手是祝愿
先考虑求出最小操作次数 \(c\) 。
考虑从大到小枚举 \(n\) 盏灯,若当前这盏灯是亮的,那么求将这盏灯熄灭,并更新左右它的约数。
若初始局面需要的最小操作次数小于等于 \(k\) ,显然操作次数为最小操作次数。
我们可以预处理出 \(dp(i)\) 表示有 \(i\) 个选择变为 \(i-1\) 个选择的最小操作次数。
则转移为:
\]
化简得:
\]
则最终答案期望为:
\]
别忘了最终答案乘上 \(n!\) 。
$\texttt{code}$
n=rd(),k=rd();
for(int i=1;i<=n;i++) if(rd()) b[i]=true;
for(ll i=1;i<=n;i++) for(ll j=i;j<=n;j+=i) yue[j].pb(i);
for(int i=n;i>=1;i--) if(b[i])
{
for(int j:yue[i]) b[j]^=1;
cnt++;
}
if(cnt<=k) ans=cnt;
else
{
dp[n]=1;
for(ll i=n-1;i>=1;i--)
dp[i]=(1ll+(1ll*n-i)*(dp[i+1]+1ll)%mod*ksm(i,mod-2)%mod)%mod;
for(int i=k+1;i<=cnt;i++) ans=(ans+dp[i])%mod;
ans=(ans+k)%mod;
}
for(ll i=1;i<=n;i++) ans=ans*i%mod;
printf("%lld\n",ans);
期望 概率DP的更多相关文章
- HDU 3853 期望概率DP
期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] , 右移:[x][y ...
- 【BZOJ 3652】大新闻 数位dp+期望概率dp
并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的 ...
- 【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基
大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了 期望概率 ...
- 【NOIP模拟赛】黑红树 期望概率dp
这是一道比较水的期望概率dp但是考场想歪了.......我们可以发现奇数一定是不能掉下来的,因为若奇数掉下来那么上一次偶数一定不会好好待着,那么我们考虑,一个点掉下来一定是有h/2-1个红(黑),h/ ...
- BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp
首先这道题让我回忆了一下最短路算法,所以我在此做一个总结: 带权: Floyed:O(n3) SPFA:O(n+m),这是平均复杂度实际上为O(玄学) Dijkstra:O(n+2m),堆优化以后 因 ...
- 期望概率DP
期望概率DP 1419: Red is good Description 桌面上有\(R\)张红牌和\(B\)张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付 ...
- UVa 11427 Expect the Expected (数学期望 + 概率DP)
题意:某个人每天晚上都玩游戏,如果第一次就䊨了就高兴的去睡觉了,否则就继续直到赢的局数的比例严格大于 p,并且他每局获胜的概率也是 p,但是你最玩 n 局,但是如果比例一直超不过 p 的话,你将不高兴 ...
- Hello 2019 D 素因子贡献法计算期望 + 概率dp + 滚动数组
https://codeforces.com/contest/1097/problem/D 题意 给你一个n和k,问n经过k次操作之后留下的n的期望,每次操作n随机变成一个n的因数 题解 概率dp计算 ...
- 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学
神™题........ 这道题的提示......(用本苣蒻并不会的积分积出来的)并没有 没有什么卵用 ,所以你发现没有那个东西并不会 不影响你做题 ,然后你就可以推断出来你要求的是我们最晚挑到第几大的 ...
- BZOJ2337: [HNOI2011]XOR和路径 期望概率dp 高斯
这个题让我认识到我以往对于图上期望概率的认识是不完整的,我之前只知道正着退还硬生生的AC做过的所有图,那么现在让我来说一下逆退,一般来说对于概率性的东西都只是正推,因为有了他爸爸才有了他,而对于期望性 ...
随机推荐
- 网络前置任务(Pretext task)和下游任务(downstream tasks)
Pretext task 可以理解为是一种为达到特定训练任务而设计的间接任务. 比如,要训练一个网络来对 ImageNet 分类,可以表达为 $f_{\theta}(x): x \rightarrow ...
- 字符串出现的topK问题
/** * return topK string * @param strings string字符串一维数组 strings * @param k int整型 the k * @return str ...
- 一文详解JavaScript的继承模式
1 原型链继承 #### ES6中通过原型继承多个引用类型的属性和方法,由于原型和实例的关系,即每个构造函数都有自己的原型对象,同时原型有一个属性指向构造函数,并且实例有一个内部的指针指向原型.如果存 ...
- 初探webpack之编写plugin
初探webpack之编写plugin webpack通过plugin机制让其使用更加灵活,以适应各种应用场景,当然也大大增加了webpack的复杂性,在webpack运行的生命周期中会广播出许多事件, ...
- 实现一个简单的侧边导航Winform程序框架
目录 简介 实现导航面板 实现方法 使用方法 实现标题栏 窗体拖拽及最大化 自定义窗体按钮 标题显示 按钮设置 实现状态栏 整体使用 参考文章 简介 每次新项目都要想着界面怎么设计好,但想来想去上位机 ...
- ECMA 2022 (es13) 新特性
本文主要整理了截至到 2021年10月12日 为止的且处于 Stage 3->Stage 4 阶段的ECMA提案. 主要包括: Class Fields RegExp Match Indices ...
- web_security学习路线
一.了解黑客是如何工作的 1.在虚拟机配置Linux系统 2.漏洞测试工具 3.msf控制台 4.远程工具RATS 5.远程访问计算机 6.白帽 二.技术基础 漏斗扫描工具AWVS AWVS简介 安装 ...
- bzoj1067——SCOI2007降雨量(线段树,细节题)
题目描述 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意\(Y<Z<X\),Z年的降雨量严格小于X年.例如2002 ...
- zabbix和prometheus的优缺点对比
使用Prometheus(https://github.com/prometheus)原生的k8s服务发现驱动,采集容器化信息:通过微服务参数配置,暴露运行状态信息提供给prometheus,实现微服 ...
- mybatis 操作数据库(05)
类型转换.动态排序,查询接口与mapper对应关系说明及其注意事项 一.MyBatis 自带写常见类型转换器.例如:java 类中 String 对应 mySQL中的varchar 二.自定义类型转换 ...