谢老师2024春 - Day2:期望DP
Day2:期望DP
A - CF148D Bag of mice
设 \(dp_{i,j}\) 表示还剩下 \(i\) 只白鼠,\(j\) 只黑鼠 A 的胜率。
- 大家都没有拿到白鼠,那么 B 赢,\(dp_{0,0}=0\)。
- 没有白鼠了,那么 B 赢,\(dp_{0,j}=0\)。
- 全是白鼠了,那么 A 赢(A 先抓),\(dp_{i,0}=1\)。
然后转移,有这几种情况:
- 第一次就抓到白鼠:\(dp_{i,j}=\frac{i}{i+j}\)。
- A 抓到黑鼠,B 抓到黑鼠,跑出来白鼠:\(dp_{i,j}=dp_{i-1,j-2}\times\frac{j}{i+j}\times\frac{j-1}{i+j-1}\times\frac{i}{i+j-2}\)(三个分数表示跑出这三种鼠的概率)
- A 抓到黑鼠,B 抓到黑鼠,跑出来黑鼠:\(dp_{i,j}=dp_{i,j-3}\times\frac{j}{i+j}\times\frac{j-1}{i+j-1}\times\frac{j-2}{i+j-2}\)(三个分数表示跑出这三种鼠的概率)
- 其他情况 A 都是输掉的,不用管他。
注意 2,3 两种情况对于剩余的黑白老鼠数量有要求。
#include <bits/stdc++.h>
using namespace std;
double frac(int a,int b){return 1.0*a/b;}
double DP[1005][1005];
int w,b;
int main()
{
scanf("%d%d",&w,&b);
DP[0][0]=0; //都没抽到,B赢
for(int i=1;i<=w;i++) DP[i][0]=1; //全是白鼠,A赢
for(int j=1;j<=b;j++) DP[0][j]=0; //全是黑鼠,B赢
for(int i=1;i<=w;i++){
for(int j=1;j<=b;j++){
DP[i][j]+=1.0*i/(i+j); //先手直接抽到白鼠
if(i>=1&&j>=2) DP[i][j]+=DP[i-1][j-2]*frac(j,i+j)*frac(j-1,i+j-1)*frac(i,i+j-2); //A黑鼠,B黑鼠,跑白鼠
if(j>=3) DP[i][j]+=DP[i][j-3]*frac(j,i+j)*frac(j-1,i+j-1)*frac(j-2,i+j-2); //A黑鼠,B黑鼠,跑黑鼠
}
}
printf("%.9lf",DP[w][b]);
return 0;
}
B - P4316 绿豆蛙的归宿
拓扑+DP。
搞一个反图,跑拓扑的同时算期望:每个点的期望距离=(他所有前缀的期望距离+路径长度)*概率。
#include <bits/stdc++.h>
using namespace std;
struct Graph{
int Val[200005],Go[200005],Deg[100005],Deg2[100005];
int Head[100005],Next[200005],tot;
void Add_edge(int u,int v,int w){++tot,Next[tot]=Head[u],Head[u]=tot,Val[tot]=w,Go[tot]=v,Deg[v]++,Deg2[v]++;}
}G;
int node[100005],cnt;
double dis[100005];
int n,m,u,v,w;
queue<int>q;
void TUPO(int u){
for(int i=1;i<=n;i++) if(G.Deg[i]==0) q.push(i);
while(!q.empty()){
int u=q.front();q.pop();
node[++cnt]=u;
for(int i=G.Head[u];i;i=G.Next[i]){
int v=G.Go[i];G.Deg[v]--;
dis[v]+=1.0*(dis[u]+G.Val[i])/G.Deg2[v];
if(G.Deg[v]==0){
q.push(v);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
G.Add_edge(v,u,w);
}TUPO(n);
printf("%.2lf",dis[1]);
return 0;
}
C - CF768D Jon and Orbs
为什么感觉比 A,B 简单
设 \(dp_{i,j}\) 已经取了 \(i\) 次,取出了 \(j\) 种的概率,一共有 \(k\) 种,\(dp_{0,0}=1\)。
然后转移,有这几种情况:
- 某一天抓到了已经抓过的,\(dp_{i,j}=dp_{i-1,j}\times\frac{j}{k}\)
- 某一天抓到了没有抓过的,\(dp_{i,j}=dp_{i-1,j-1}\times\frac{k-j+1}{k}\)
我们的 \(i\) 最大期望其实就是调和级数 \(O(n \ln n)\) 级别的,开个 \(10000\) 左右差不多,复杂度也可以。
预处理就好了,不要每一个询问算一次。
#include <bits/stdc++.h>
using namespace std;
const int maxn=10000;
double DP[10005][1005];
int k,q,p[10005];
int main()
{
scanf("%d%d",&k,&q);
for(int i=1;i<=q;i++){
scanf("%d",&p[i]);
}
DP[0][0]=1;
for(int i=1;i<=maxn;i++){
for(int j=1;j<=k;j++){
DP[i][j]+=1.0*DP[i-1][j]*j/k;
DP[i][j]+=1.0*DP[i-1][j-1]*(k-j+1)/(k);
}
}
for(int i=1;i<=q;i++){
for(int j=1;j<=maxn;j++){
if(DP[j][k]>=p[i]/2000.0){
printf("%d\n",j);
break;
}
}
}
return 0;
}
D - P1365 WJMZBMR打osu! / Easy
不会。
E - P1850 [NOIP2016 提高组] 换教室
不会。
F - P2473 [SCOI2008] 奖励关
不会。
G - CF24D Broken robot
不会。
H - P3232 [HNOI2013] 游走
不会。
谢老师2024春 - Day2:期望DP的更多相关文章
- 2018.08.30 花园(期望dp)
题目背景 SCOI2017 DAY2 T1 题目描述 小 A 的花园的长和宽分别是 L,H .小 A 喜欢在花园里做游戏.每次做游戏的时候,他都先把花园均匀分割成 L×H 个小方块,每个方块的长和宽都 ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- [NOIP2016]换教室 D1 T3 Floyed+期望DP
[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- 【BZOJ-4008】亚瑟王 概率与期望 + DP
4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 832 Solved: 5 ...
- 期望dp BZOJ3450+BZOJ4318
BZOJ3450 概率期望DP f[i]表示到i的期望得分,g[i]表示到i的期望长度. 分三种情况转移: ① s[i]=‘x’:f[i]=f[i-1],g[i]=0 ② s[i]=‘o’:f[i]= ...
- HDU 4405 期望DP
期望DP算是第一题吧...虽然巨水但把思路理理清楚总是好的.. 题意:在一个1×n的格子上掷色子,从0点出发,掷了多少前进几步,同时有些格点直接相连,即若a,b相连,当落到a点时直接飞向b点.求走到n ...
- POJ 2096 【期望DP】
题意: 有n种选择,每种选择对应m种状态.每种选择发生的概率相等,每种选择中对应的每种状态发生的概率相等. 求n种选择和m种状态中每种至少发生一次的期望. 期望DP好别扭啊.要用倒推的方法. dp[i ...
- ZOJ 3822 Domination 期望dp
Domination Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showProblem ...
- poj 2096 Collecting Bugs(期望 dp 概率 推导 分类讨论)
Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...
随机推荐
- k8s中port-forward 、service的nodeport与ingress区别
在Kubernetes中,port-forward.Service的NodePort和Ingress都是用于将外部流量引入集群内部的方法,但它们在使用场景.实现方式和功能上有所不同. port-for ...
- Ubuntu下安装Android Studio
一.系统环境 二.安装源文件 Android Studio 4.2.2:android-studio-ide-202.7486908-linux.tar.gz Java SE Development ...
- 16_AAC解码实战
本文主要讲解:如何将AAC编码后的数据解码成PCM. 命令行 用法非常简单: ffmpeg -c:a libfdk_aac -i in.aac -f s16le out.pcm -c:a libfdk ...
- centos如何换源
centos如何换源? 万事先备份 mkdir -p /etc/yum/backup/ cp -r /etc/yum.repos.d/* /etc/yum/backup/ 1.将源文件备份 cd /e ...
- CC2530 中的ZigBee协议栈
CC2530 中的ZigBee协议栈 1.何为协议栈 ZigBee协议栈将各个层的协议集合在一起,并以函数的形式实现,并且向用户提供接口,用户能够直接调用. 它本身就为一个工程. 2. 如何使用 开始 ...
- IDEA怎么添加类注释和方法注释模板
IDEA设置自动生成模板类和方法注释 一.模板类注释 在右侧粘贴如下代码: /** *@BelongsProject: ${PROJECT_NAME} *@BelongsPackage: ${PACK ...
- mybatis踩坑之integer类型是0的时候会被认为0!=''是假
当你的参数类型是integer类型,并且传的是0的时候,在SQL里面做if判断的时候 <if test="auditStatus != null and auditStatus != ...
- #根号分治,分块#洛谷 5309 [Ynoi2011] 初始化
题目传送门 分析 如果 \(x\) 比较大那么可以暴力修改,\(x\) 比较小的话可以用数组打标记 查询的时候对于暴力修改的部分可以分块,暴力修改的同时需要给块打标记 如果 \(x\) 比较小的情况, ...
- #高精度,卡特兰数#洛谷 2532 [AHOI2012]树屋阶梯
题目 分析 设\(dp[n]\)表示大小为\(n\)的树屋阶梯方案数,如何不算重也不算漏 考虑在左下角填充一个尽量大的矩形,一共有\(n\)种方法, 然后剩下的两头就可以用前面的结果表示 也就是\(d ...
- #线段树#洛谷 4588 [TJOI2018]数学计算
题目传送门 分析 由于曾经做过原题 所以就直接说了,因为每个数最多被除掉一次 所以可以用线段树维护区间乘,也就很简单了,删除就单点修改就行了 代码 #include <cstdio> #i ...