题意:给定一棵有n个节点的树,现在要给节点附1~n的权值(各节点权值不能相同),一棵子树的领袖就是子树中权值最大的节点,问有多少种分配方案使得最后有恰好K个领袖。

解法:这道题一看以为是树上的计数问题,想了好久的树形DP没想到,最后看题解才知道解法是概率DP(qwq)。解法还是非常巧妙的,感觉自己现在还没理解到它的精髓。

先求出这棵树以i点位根的子树的结点个数son[i],然后就不用管这棵树了。设dp[i][j]为前i棵子树恰好有j个领袖的概率。

因为问的是方案数,所以随机选,选择没有优劣之分每个点都是等概率的,那么我们可以写出dp方程。

dp[i][j]=(dp[i-1][j]*(son[i]-1)/son[i] , dp[i-1][j-1]*1/son[i] ) 前面代表第i个点就是领袖后面代表第i个点不是领袖。

注意这是个线性递推方程式,此时这里的i是线性的,与树的结构已经没有关系了。

求出dp[n][k]之后,答案就是dp[n][k]*n!

代码要注意因为每次都要除以son[i]所以难免要求逆元,因为状态多达1000^2个所以不先把逆元预处理出来会TLE。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e3+;
const int P=1e9+;
int n,k,son[N];
int dp[N][N];
vector<int> G[N]; LL power(LL x,LL p) {
LL ret=;
for (;p;p>>=) {
if (p&) ret=ret*x%P;
x=x*x%P;
}
return ret;
} void dfs(int x,int fa) {
son[x]=;
for (int i=;i<G[x].size();i++) {
int y=G[x][i];
if (y==fa) continue;
dfs(y,x);
son[x]+=son[y];
}
} int inv[N];
void prework() {
for (int i=;i<=;i++) inv[i]=power(i,P-);
} int main()
{
prework();
int T,cas=; cin>>T;
while (T--) {
scanf("%d%d",&n,&k);
for (int i=;i<=n;i++) G[i].clear();
for (int i=;i<n;i++) {
int x,y; scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
for (int i=;i<=n;i++) son[i]=;
dfs(,); for (int i=;i<=n;i++) for (int j=;j<=n;j++) dp[i][j]=;
dp[][]=;
for (int i=;i<=n;i++)
for (int j=;j<=min(i,k);j++) {
if (j<) dp[i][j]=(LL)dp[i-][j]*(son[i]-)%P*inv[son[i]]%P;
else dp[i][j]=((LL)dp[i-][j]*(son[i]-)%P*inv[son[i]]%P+(LL)dp[i-][j-]**inv[son[i]]%P)%P;
} int ans=dp[n][k];
for (int i=;i<=n;i++) ans=((LL)ans*i)%P;
printf("Case #%d: %d\n",++cas,ans);
}
return ;
}

HDU-5378 概率DP的更多相关文章

  1. HDU 4599 概率DP

    先推出F(n)的公式: 设dp[i]为已经投出连续i个相同的点数平均还要都多少次才能到达目标状态. 则有递推式dp[i] = 1/6*(1+dp[i+1]) + 5/6*(1+dp[1]).考虑当前这 ...

  2. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  3. hdu 3853 概率dp

    题意:在一个R*C的迷宫里,一个人在最左上角,出口在右下角,在每个格子上,该人有几率向下,向右或者不动,求到出口的期望 现在对概率dp有了更清楚的认识了 设dp[i][j]表示(i,j)到(R,C)需 ...

  4. HDU 4815 概率dp,背包

    Little Tiger vs. Deep Monkey Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K ( ...

  5. hdu 4050(概率dp)

    算是挺简单的一道概率dp了,如果做了前面的聪聪于可可的话,这题不需要什么预处理,直接概率dp就行了... #include <stdio.h> #include <stdlib.h& ...

  6. HDU 4405 (概率DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4405 题目大意:飞行棋.如果格子不是飞行点,扔骰子前进.否则直接飞到目标点.每个格子是唯一的飞行起点 ...

  7. hdu 4336 概率dp + 状压

    hdu 4336 小吃包装袋里面有随机赠送一些有趣的卡片,如今你想收集齐 N 张卡片.每张卡片在食品包装袋里出现的概率是p[i] ( Σp[i] <= 1 ), 问你收集全部卡片所需购买的食品数 ...

  8. hdu 4576(概率dp+滚动数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576 思路:由于每次从某一位置到达另一位置的概率为0.5,因此我们用dp[i][j]表示第i次操作落在 ...

  9. hdu 5001 概率DP 图上的DP

    http://acm.hdu.edu.cn/showproblem.php?pid=5001 当时一看是图上的就跪了 不敢写,也没退出来DP方程 感觉区域赛的题  一则有一个点难以想到 二则就是编码有 ...

  10. hdu 3853LOOPS (概率DP)

    LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Su ...

随机推荐

  1. Feign Dynamic URL

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11811932.html Project Directory Maven Dependency < ...

  2. zabbix邮件报警通过脚本来发送邮件

    zabbix默认邮件报警会将各个报警接收人单独发送邮件,为了使邮件能以群发的方式统一一封邮件发送所有接收人,需要改成脚本的形式: sendemail.py: #!/usr/bin/python imp ...

  3. jmeter接口测试与接口测试工具

    接口测试与接口测试工具 1,什么是接口? 接口,Application Programming Interface(API) 通俗的讲 就是HTTP请求 2,什么是接口测试? 接口测试测试组件间接口的 ...

  4. 英语单词Obsolete

    Obsolete 来源——命令帮助 [root@centos73 ~]# help typeset typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...

  5. C语言版本学生信息管理系统

    仍然有一些小bug,后续会发布OC完善版的图书馆管理系统,欢迎批评指正. #include <stdio.h> void menu_choose(); typedef struct { i ...

  6. 如何删除发布服务器distribution

    在建立发布服务器后自动生成distribution数据库为系统数据库,drop无法删除,实际删除方法如下:在“对象资源管理器”-“复制”上点击右键,选择“禁用发布和分发”,依次执行即可完成该系统数据库 ...

  7. php implode()函数 语法

    php implode()函数 语法 作用:把数组元素组合为字符串惠州大理石平板 语法:implode(separator,array) 参数: 参数 描述 separator     可选.规定数组 ...

  8. Python_014(面向对象之继承)

    一.面向对象之继承 1.初始继承 引入:面向对象的三大特性:继承,多态,封装 a.继承是创建新类的一种方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类;新建的类称为派生类 ...

  9. HelloServlet类继承HttpServlet利用HttpServletResponse对象

    HelloServlet类继承HttpServlet利用HttpServletResponse对象 HelloServlet类的doGet()方法先得到username请求参数,对其进行中文字符编码转 ...

  10. poj3744 (概率DP+矩阵快速幂)

    http://poj.org/problem?id=3744 题意:在一条铺满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,10000000 ...