UVALive - 5002 The Queue树形dp

news/2024/10/22 13:44:21/

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3003

题意是有n个员工,n-1条关系,a b ,a是b的上司,很明显树形结构

排队时,上司必须要在前面,求有多少种排列方法

dp【i】表示i的下属的排列方法有多少种

其中叶子节点肯定都赋为1

我们设a【i】为i的下属的个数,son1,son2,son3.。。。。为 i 的子节点

dp【i】=

举一个简单的例子


按后序遍历树的顺序求dp值

叶子不看了,2这个节点有三个子节点,子节点都是叶子,所以下属只有3个,


所以所有的可行排列方式有30种,

再解释一下这个转移方程,求dp【1】时,相当于我先选4个位置,放2这颗子树上的所有点,然后2这个点肯定要放在最前面,后面3个位置有dp【2】种放法




上面的求解方程可以化简一下,速度可能会快一些(用几个简单的字母表示,其中a=b+c+d)



#include<bits/stdc++.h>
using namespace std;vector<int>tree[1050];
long long ji[1050],ni[1050];//ji 阶乘   ni乘法逆元
const long long mo=1e9+7;
long long dp[1050],num[1050];//dp方案数 ,num下属加上自己的个数long long int poww(long long x)
{long long t=x,ans=1,p=mo-2;while(p){if(p&1){ans=(ans*t)%mo;}t=(t*t)%mo;p>>=1;}return ans;
}int init()
{   long long i;ji[1]=1;ni[1]=1;for(i=2;i<=1000;i++){ji[i]=(ji[i-1]*i)%mo;ni[i]=poww(ji[i]);}
}void dfs(int rt)
{	    if(tree[rt].size()==0){num[rt]=1;dp[rt]=1;return ;}int i;long long ans=1,cu=1,sum=0,j;for(i=0;i<tree[rt].size();i++){j=tree[rt][i];dfs(j);ans*=dp[j];if(ans>=mo) ans%=mo;cu*=ni[num[j]];if(cu>=mo) cu%=mo;sum+=num[j];}num[rt]=sum+1;ans*=ji[sum];if(ans>=mo) ans%=mo;ans*=cu;if(ans>=mo) ans%=mo;dp[rt]=ans;
}int main()
{int t,n,a,b,i,k=1;int book[1050];init();scanf("%d",&t);while(t--){memset(book,0,sizeof(book));memset(dp,0,sizeof(dp));memset(num,0,sizeof(num));scanf("%d",&n);for(i=0;i<=n;i++) tree[i].clear();for(i=1;i<n;i++){scanf("%d%d",&a,&b);book[b]=1;tree[a].push_back(b);}for(i=1;i<=n;i++){if(!book[i])tree[0].push_back(i);}dfs(0);printf("Case %d: %lld\n",k++,dp[0]);}
}





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

相关文章

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…

HDU 5002 Tree

题意&#xff1a; 一棵树 支持删边加边、路径权值加值、路径权值改值、路径求第二大的数字和其个数 思路&#xff1a; LCT的第二题 题意已经把功能都告诉了 比较裸 要注意的是权值加值和改值两个操作的标记下放问题 要先down改值 再down加值 对于路径的操作通过mroot…

例5002 进制转换

例5002 进制转换 Time Limit: 1000/1000MS (C/Others) Memory Limit: 65536/65536KB (C/Others) Total Submissions: 190 Accepted Submissions: 39 Problem Description 输入一个十进制数N&#xff0c;将它转换成R进制数输出。 Input 输入数据包含多个测试实例&#xff0c;每…

LCT - hdu5002 Tree

题目&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid5002 题意&#xff1a; 给一棵树树&#xff0c;提供四种操作 1&#xff1a;删除(x,y)边&#xff0c;添加(a,b)边&#xff0c;保证操作前后都是合法的树 2&#xff1a;修改a--b路径上所有点的权值为x 3&#…

1144: 5002 进制转换

题目描述 输入一个十进制数N&#xff0c;将它转换成R进制数输出。 输入 输入数据包含多个测试实例&#xff0c;每个测试实例包含两个整数N&#xff08;32位整数&#xff09;和R&#xff08;2<R<16&#xff0c;R ! 10&#xff09;。 输出 为每个测试实例输出转换后的…