期望 概率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做过的所有图,那么现在让我来说一下逆退,一般来说对于概率性的东西都只是正推,因为有了他爸爸才有了他,而对于期望性 ...
随机推荐
- clickonce的密钥到期问题处理
最近clickonce的密钥到期了,在网上找了些文章用来修改密钥的到期时间,已成功生成新密钥,好不好使暂时未测. 在此小结一下,以备参考: 1.在原密钥所属电脑上cmd执行如下命令 renewcert ...
- 一文带你了解.Net读写锁
本文主要讲解.Net基于ReaderWriterLockSlim讲解读写锁 基础概念 读写锁是一个具有特殊用途的线程锁,适用于频繁读取且读取需要一定时间的场景,共享资源的读取操作通常是可以同时执行的, ...
- PyTorch学习笔记6--案例2:PyTorch神经网络(MNIST CNN)
上一节中,我们使用autograd的包来定义模型并求导.本节中,我们将使用torch.nn包来构建神经网络. 一个nn.Module包含各个层和一个forward(input)方法,该方法返回outp ...
- STM32CbueIDE 与 J-Link
STM32CbueIDE 与 J-Link 无论是 STM32CbueIDE 还是 Keil, 在使用 JLink 的时候都不过是先启 JLink 的 GDB 服务,然后再"远程" ...
- Java基础系列(20)- while循环
循环结构 while循环 do-循环 for循环 在java5中引入了一种主要用于数组的增强型for循环 while循环 while是最基本的循环,它的结构为 while(布尔表达式){ //循环内容 ...
- IDEA - 2019中文版安装教程
前言 个人安装备忘录 软件简介 IDEA 全称IntelliJ IDEA,是java语言开发的集成环境,在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持. ...
- 深入HTML5第二天
sub(subscripted下标标签)和sup(superscripted上标标签) 内联元素:inline element span(范围标签):内联元素inline element 特性:没有 ...
- chrome浏览器中安装以及使用Elasticsearch head 插件
一.安装Elasticsearch head 插件 下载安装包:https://github.com/liufengji/es-head/commit/121cdcb6d1b18656461e4889 ...
- 如何在word中美观地插入编程代码
零.缘起 在整理Java笔记时,想把代码直接贴到word文档中,原来一直截图很麻烦,所以找到以下方法. 思想:问题比答案更重要!你能想到问题,才知道去百度搜索. 一.打开网站 http://www.p ...
- ci框架 自定义配置方法
系统自动在Application文件夹下生成的config.php文件,采用key-value关联数组的形式来存放配置项和值.为了使结构更清晰,手动新建另外一个配置文件myconfig.php,所采用 ...