HDU-5378 概率DP
题意:给定一棵有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的更多相关文章
- HDU 4599 概率DP
先推出F(n)的公式: 设dp[i]为已经投出连续i个相同的点数平均还要都多少次才能到达目标状态. 则有递推式dp[i] = 1/6*(1+dp[i+1]) + 5/6*(1+dp[1]).考虑当前这 ...
- HDU 5001 概率DP || 记忆化搜索
2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP 測 ...
- hdu 3853 概率dp
题意:在一个R*C的迷宫里,一个人在最左上角,出口在右下角,在每个格子上,该人有几率向下,向右或者不动,求到出口的期望 现在对概率dp有了更清楚的认识了 设dp[i][j]表示(i,j)到(R,C)需 ...
- HDU 4815 概率dp,背包
Little Tiger vs. Deep Monkey Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K ( ...
- hdu 4050(概率dp)
算是挺简单的一道概率dp了,如果做了前面的聪聪于可可的话,这题不需要什么预处理,直接概率dp就行了... #include <stdio.h> #include <stdlib.h& ...
- HDU 4405 (概率DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4405 题目大意:飞行棋.如果格子不是飞行点,扔骰子前进.否则直接飞到目标点.每个格子是唯一的飞行起点 ...
- hdu 4336 概率dp + 状压
hdu 4336 小吃包装袋里面有随机赠送一些有趣的卡片,如今你想收集齐 N 张卡片.每张卡片在食品包装袋里出现的概率是p[i] ( Σp[i] <= 1 ), 问你收集全部卡片所需购买的食品数 ...
- hdu 4576(概率dp+滚动数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576 思路:由于每次从某一位置到达另一位置的概率为0.5,因此我们用dp[i][j]表示第i次操作落在 ...
- hdu 5001 概率DP 图上的DP
http://acm.hdu.edu.cn/showproblem.php?pid=5001 当时一看是图上的就跪了 不敢写,也没退出来DP方程 感觉区域赛的题 一则有一个点难以想到 二则就是编码有 ...
- hdu 3853LOOPS (概率DP)
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others) Total Su ...
随机推荐
- MaxCompute按量计费计算任务消费监控告警
MaxCompute 按量计费资源为弹性伸缩资源,对于计算任务,按任务需求提供所需资源,对资源使用无限制,同时MaxCompute按量计费的账单为天账单,即当天消费需要第二天才出账,因此,有必要对计算 ...
- stack2链栈
#include<iostream> using namespace std; template <class Object> class Stack{ private: st ...
- 前端面试之路之HTML面试真题
1.doctype的意义是什么 让浏览器以标准模式渲染 让浏览器知道元素的合法性 2.HTML XHTML HTML5的关系 HTML属于SGML XHTML属于XML,是HTML进行XML严格化的结 ...
- Fault Contract
The Fault Contract sample demonstrates how to communicate error information from a service to a clie ...
- PHP csv导出数据 (二)
全部导出和时间导出 html代码,全程并不需要引用什么插件 <include file="public@header"/> <link href="__ ...
- science_action
w import random import pprint import math import matplotlib.pyplot as plt def gen_random(magnify_=10 ...
- 微软手写识别模块sdk及delphi接口例子
http://download.csdn.net/download/coolstar1204/2008061 微软手写识别模块sdk及delphi接口例子
- SparkSQL架构
Spark SQL运行架构 Spark SQL由Core.Catalyst.Hive和Hive-Thriftserver组成 core:负责处理数据的输入/输出,从不同的数据源获取数据(如RDD.Pa ...
- React后台管理手动封装图片上传组件
分为两个文件夹,index.js(逻辑文件) styled.js(样式文件) index.js文件,编写完成之后在对应的地方引入即可 import React from "react&quo ...
- 记一次 Json 对象转换为 Java 对象的问题
1.描述 最近在使用 Jackson 将 Json 串转换回 Java 对象的时候遇到了 ClassCastException 错误,特此记述. 2.问题复现 问题出现的节点在于属性节点的 JavaT ...