hdu6710 Kaguya(2019CCPC网络赛1009)概率DP

题目链接
设左边为白点,右边是黑点。
假设我们求的是1号和2号之间的路径期望长度(1号是白的2号是黑的)
我们可以从1号结点出发跑一个BFS,如果第i层黑色结点个数为l,那么2号就有l/m的几率是这一层的结点。
d p ( i , j , k , l ) dp(i,j,k,l) dp(i,j,k,l)为BFS到第i层的时候,已经用掉了j个白色结点,k个黑色结点,并且第i层的结点个数为l的概率。我们可以枚举下一层的结点个数t来转移:
假设当前层是白色层,下一层是黑色层,有(x=m-k)个黑点没有被bfs到,那么这x个黑点有t个和当前层的l个白点连边的概率为:
P = C x t ∗ ( 1 − ( 1 2 ) l ) t ∗ ( 1 2 ) l ( x − t ) P=C_x^t*(1-(\frac{1}{2})^l)^t*(\frac{1}{2})^{l(x-t)} P=Cxt(1(21)l)t(21)l(xt)
那么转移就是:
d p ( i + 1 , j , k + t , t ) + = d p ( i , j , k , l ) ∗ P dp(i+1,j,k+t,t)+=dp(i,j,k,l)*P dp(i+1,j,k+t,t)+=dp(i,j,k,l)P
白点同理。
按照这个思路,用longlong写出的比较好理解的代码:

#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) ((x)&(-(x)))
using namespace std;
ll mod;
ll qm(ll a, l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值