记录一些比较水不值得单独写一篇blog的概率dp题目


bzoj3036 绿豆蛙的归宿

Description

随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。

给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度。绿豆蛙从起点出发,走向终点。

到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为\(\frac{1}{K}\) 。

现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?

Input

第一行: 两个整数 N M,代表图中有N个点、M条边

第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边

Output

从起点到终点路径总长度的期望值,四舍五入保留两位小数。

Hint

对于100%的数据,\(N\leq 100000,M\leq 2N\)

写题那天bzoj又又又又又炸了,这放的是一个dbzoj的链接

话说今天上午做[SCOI2008]奖励关那题,顺推逆推好久弄不明白,做个水题放松一下

直接设状态\(f_i\)是从\(i\)到\(n\)的路径长度期望

dfs的时候直接把每种路径的长度和加起来,再除以它的出度就行了

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n,m;
double f[100006];
int vis[100006],out[100006];
int fir[100006],nex[200005],to[200006],w[200006];
void dfs(int x){
if(vis[x]) return;
vis[x]=1;
for(reg int v,i=fir[x];i;i=nex[i]){
v=to[i];
dfs(v);
f[x]+=f[v]+w[i];
}
if(out[x]) f[x]/=out[x];
}
int main(){
n=read();m=read();
for(reg int x,y,z,i=1;i<=m;i++){
x=read();y=read();z=read();
to[i]=y;w[i]=z;
nex[i]=fir[x];fir[x]=i;
out[x]++;
}
dfs(1);
std::printf("%.2lf",f[1]);
return 0;
}

CF 518D

有\(n\)个人排成一列,每秒中队伍最前面的人有\(p\)的概率走上电梯(一旦走上就不会下电梯),或者有\(1 - p\)的概率不动。问你\(T\)秒过后,在电梯上的人的期望。

转换为求概率,设\(f_{i,j}\)为时间为\(i\),电梯上有\(j\)个人的概率

那么很显然,\(f_{i,j}p\rightarrow f_{i+1,j+1},f_{i,j}(1-p)\rightarrow f_{i+1,j}\)

最后统计成期望就行了

但还有一点,就是如果当前已经有\(n\)个人在电梯上了,不会走下来,就要\(f_{i+1,n}+=f_{i,n}\)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n,t;
double p;
double f[2006][2006];//时间为i,电梯上有j人的概率
int main(){
std::scanf("%d%lf%d",&n,&p,&t);
f[1][0]=1-p;f[1][1]=p;
for(reg int i=1;i<t;i++){
f[i+1][n]+=f[i][n];
for(reg int j=0;j<n;j++)
f[i+1][j]+=f[i][j]*(1-p),
f[i+1][j+1]+=f[i][j]*p;
}
reg double ans=0;
for(reg int i=1;i<=n;i++) ans+=i*f[t][i];
std::printf("%lf",ans);
return 0;
}

最新文章

  1. 【DWR系列02】-DWR逆向Ajax即服务器推送
  2. ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper的解决办法
  3. 浏览器功能记住账号和密码解决方法(HTML解决方式)
  4. 原创:phoenix4.6.0连接hbase1.1.2(不使用phoenix-4.6.0-HBase-1.1-client.jar)
  5. Cisco ASA intra-interface routing
  6. Adaboost算法初识
  7. TCP/IP简介
  8. 对话框上右下角显示resize icon(可以拖动改变对话框的大小)(在WM_CREATE的时候,增加WS_THICKFRAME风格)
  9. WPF 之 窗口间传参数
  10. linux中压缩与解压缩命令小结
  11. PIMP模式的理解
  12. Struts2 文件上传,下载,删除
  13. Fractal_Test
  14. Java提高学习之Object(3)
  15. hdu 5288||2015多校联合第一场1001题
  16. JavaSSM框架面试
  17. 快速制作gif动图
  18. windows 动态库的封装以及调用
  19. Grok patterns 汇总
  20. 深入浅出的webpack构建工具--webpack4+vue+router项目架构(十四)

热门文章

  1. Boyer-Moore字符串搜索(BM算法)的Python实现
  2. intelij idea 和 eclipse 使用上的区别
  3. C语言局部数组大小与内存的栈的关系
  4. AJ学IOS 之第一次打开Xcode_git配置,git简单学习
  5. 小说光看还不够?用Python做有声小说!
  6. AI vs PS 矢量 VS 位图
  7. .NET Core3.1总体预览和第一个Core程序的创建
  8. shiro:注解配置(五)
  9. Python 中取代 Printf 大法的工具
  10. orcale 树形结构查询