E - The Queue UVALive - 5002 树形dp

news/2024/10/22 13:33:14/

题目链接

题意:n个人排队,每个人b除CEO外都有一个监督人a,b必须排在a的后面,问有多少排队方案。

  思路: 这是一道树形dp和组合数学的题目,当时训练的时候公式推对了 ,但是写的时候想错了...

这道题我一看是n个点 n-1个边 又有上下级关系 所以我们就想到可以看成一个树,那么我们dp[i] 表示以i为根节点所能排队的方案数,

num[i]表示以i为根节点的字数一共有几个结点,那么我们在将两个点合并到上层的时候

有: C(num[i]+num[j],num[i])*dp[i]*dp[j];

但是我们在合并的时候 考虑到会出现n叉树所以不能两两合并,那么我们就将其处理成每次一个子树和其父节点合并

转化成(C[num[u]-1][num[v]])*dp[u]%mod)*dp[v] u代表根节点 -1 去掉根节点

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2222;
const ll mod=1e9+7;
ll C[maxn][maxn];
int book[maxn];
ll dp[maxn],num[maxn];
vector<int>vt[maxn];
int t,n,a,b;
void init()
{C[1][0]=C[1][1]=C[0][0]=1;for(int i=1;i<maxn;i++){C[i][i]=C[i][0]=1;for(int j=1;j<i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;}return ;
}
void dfs(int u,int f)
{ 	int i,v;dp[u]=1;num[u]=1;for(i=0;i<vt[u].size();i++){ 	v=vt[u][i];if(v==f)continue;dfs(v,u);num[u]+=num[v];dp[u]=((C[num[u]-1][num[v]])*dp[u]%mod)*dp[v]%mod;	} return ;
}
int main()
{init();/*for(int i=1;i<=10;i++){for(int j=1;j<=i;j++)printf("%lld\n",C[i][j]);}*/cin>>t;int k=1;while(t--){for(int i=1;i<=n;i++)vt[i].clear();memset(dp,0,sizeof(dp));memset(num,0,sizeof(num));memset(book,0,sizeof(book));scanf("%d",& n);for(int i=1;i<n;i++){scanf("%d %d",& a,& b);vt[a].push_back(b);book[b]++;}for(int i=1;i<=n;i++){if(!book[i]){dfs(i,-1);printf("Case %d: ",k++);printf("%lld\n",dp[i]);break;}}}return 0;
}



http://www.ppmy.cn/news/712775.html

相关文章

UVALive 5002 The Queue (树形Dp)

题意&#xff1a; 在某些特殊场合&#xff0c;Nadia公司为公司所有员工提供非常特别的午餐。 食物供应前&#xff0c;所有员工必须站在食品柜台前排队。 公司应用了排队队列的规则。 这个规则是没有人可以在他的主管面前的任何地方。 例如&#xff0c;如果Abul是Babul的负责人…

卜若的代码笔记系列-unity系列-第二章:json2-5002

1.我们返回对象数组时&#xff0c;请注意&#xff0c;来自于服务器的恶意&#xff1a; 2.这个时候我们就需要自行组装字符串了 //1.将字符串按,拆解 //2.将字符数组‘&#xff0c;’组装 //3.退格“}” 完成 IEnumerator ieReuqest(){var request (HttpWebRequest)WebRequest…

HDU 5002(概率题目)

分析&#xff1a; 本题目要分开求每一个最大值为x的概率&#xff0c;要求这一个可以先求小于等于x的概率&#xff0c;然后用p[x]-p[x-1]计算得出&#xff0c;最大值为x的概率。 假定当前最大值为x。 那么定义f[ i ]为还有i轮结束&#xff0c;是的最大值不超过x的概率。 p1(出…

UVALive - 5002 The Queue树形dp

https://icpcarchive.ecs.baylor.edu/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem3003 题意是有n个员工&#xff0c;n-1条关系&#xff0c;a b &#xff0c;a是b的上司&#xff0c;很明显树形结构 排队时&#xff0c;上司必须要在前面&…

Mysql报错5002 - cannot modify reserved database

从报错上来看是因为没有选择数据库导致的&#xff0c;但实际上我在navicat里面选择了mysql库&#xff1b;百度没有这个报错的解释与客服沟通后发现该问题是因为没有业务库导致的&#xff1b;在ECS的自建库里面&#xff0c;直接use mysql&#xff0c;然后进行操作都是OK的但是RD…

OPC - 笔记

1.详细解释一下 - OPC DA、OPC UA、OPC HDA OPC(OLE for Process Control)是一个开放的标准,用于在工业自动化和控制系统中实现数据交换和通信。OPC 标准定义了一组规范和协议,使得不同的硬件设备、传感器、仪表和软件系统能够互相通信和交换数据。 在 OPC 标准中,有几…

hdu 5002 Tree (LCT)

hdu 5002 Tree (LCT) 几乎是模板题&#xff0c;维护一个最大值和次大值即可。 代码&#xff1a; #pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<algorithm> #include<string.h> #define ls son[0][rt] …

洛谷P5002 专心OI - 找祖先 树上统计+LCA+次方余项

洛谷P5002 专心OI - 找祖先 标签 LCA树上统计次方余项的计算 简明题意 给一颗有根树&#xff0c;再给m个询问&#xff0c;对于某个节点x&#xff0c;有多少对节点的LCA是x 思路 这题非常简单。我们假设要求x的答案。显然&#xff0c;LCA是x的一对节点&#xff0c; u&#xf…