谢老师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 ...
随机推荐
- 使用gitee
git全局设置 git config --global user.name "张xx" git config --global user.email "xxx@qq.co ...
- 【2302. 统计得分小于 K 的子数组数目】前缀和+二分
class Solution { public static void main(String[] args) { Solution solution = new Solution(); soluti ...
- C#进阶篇
ArrayList 1.Arraylist本质上是一个可以自动扩容的object数组 2.由于用万物之父来存储数据,自然存在装箱拆箱 3.当往其中进行值类型存储时就是在装箱,当将值类型对象取出来转换使 ...
- C# 委托(delegate)本质理解
代码如下,很简单 namespace Delegate { class Program { delegate void SayHi(); void SayHi_1() { Console.WriteL ...
- exist和left join 性能对比
今天遇到一个性能问题,再调优过程中发现耗时最久的计划是exist 部分涉及的三个表. 然后计划用left join 来替换exist,然后查询了很多资料,大部分都说exist和left join 性能 ...
- KingbaseES PLSQL 支持语句级回滚
KingbaseES默认如果在PLSQL-block 执行过程中的任何SQL 语句导致错误,都会导致该事务的所有语句都被回滚,而Oracle 则是语句级的回滚.KingbaseES 为了更好的与 Or ...
- 基于rv1126 rkmeida 一路多出 原理
基于rv1126 rkmeida 一路多出的坑 首先说要的是介绍一下rkmedia 相关内容 RKMedia提供了一种媒体处理方案,可支持应用软件快速开发.RKMedia在各模块基础API上做进一 ...
- ET介绍——强大的MongoBson库
强大的MongoBson库 后端开发,统计了一下大概有这些场景需要用到序列化: 对象通过序列化反序列化clone 服务端数据库存储数据,二进制 分布式服务端,多进程间的消息,二进制 后端日志,文本格式 ...
- 创业:大模型RAG系统三个月的开发心得和思考
1. 前言 自从和员外上家公司离职后,我们就自己搞公司投入到了RAG大模型的AI产品应用的开发中,这中间有一个春节,前后的总时间大概是三个月左右,在这三个月期间,基本是昼夜兼程啊,到今天3月底结束,产 ...
- 详解SSL证书系列(9)SSL客户端认证
上一篇介绍了HTTPS和HTTP协议的区别,理解了HTTP加上加密处理和认证以及完整性保护后即是HTTPS,同时HTTPS也是身披SSL外壳的HTTP,那么SSL客户端认证是怎么回事呢?这篇文章我将带 ...