2022 China Collegiate Programming Contest (CCPC) Guangzhou Onsite I. Infection(树形dp)

该博客主要讲解了一道涉及树形概率动态规划和树上背包算法的复杂概率问题。题目中,一棵树的每个节点都有初始感染概率和被相邻节点传染的概率,要求求解最终不同节点被感染数量的概率。博主通过dp数组和朴素的树上背包技巧,实现了近似O(n^2)的时间复杂度解决方案,最后输出了每个节点数量被感染的概率。

题目

n(n<=2e3)个点的树,点i有一个初始权重ai(1<=ai<=1e9,sumai<=1e9),

表示有gif.latex?%5Cfrac%7Ba_%7Bi%7D%7D%7B%5Csum_%7Bi%3D1%7D%5E%7Bn%7Da_%7Bi%7D%7D的概率,成为这棵树初始被感染的点,初始被感染的点恰有一个,

此外,点i还有一个被相邻节点传染的概率pi(0<=pi<=1),

即若相邻节点感染且i此时未被感染,则有pi的概率会被感染,

pi实际以bi/ci的方式给出(1<=bi<=ci<=1e9,gcd(bi,ci)=1),

对于k=1,2,..,.n,分别输出最终局面恰有k个节点被感染的概率,答案对1e9+7取模

即若答案分数为p/q,则输出p*q的逆元对1e9+7取模的值

题解

dp[i][j][k]表示仅考虑i的子树,选了j个点,选/没选初始点的概率之和

特别地,j>0时,钦定i这个点必选,因为最终答案一定是一个连通块,

 

记a[u]为u初始感染的概率,p[u]为u后来被传染的概率,

则如果背包选了u这个点,两种状态可以选一种,dp[i][1][1]=a[u],dp[i][1][0]=p[u],

dp[i][0][1]是不合法的状态,概率为0

dp[i][0][0]=1-p[u],如果u往上的点想不传染到u这棵子树的所有点,只需要u不被传染即可

 

转移考虑枚举u和v子树最终感染的点的连通块大小i(i>0)、j(j>=0),
根据第三维分三种情况,

①u没选初始点,v没选初始点,0,0转移到0

<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值