luogu P3240 [HNOI2015]实验比较
首先根据题目条件,题目中如果是=的点可以缩起来,然后\(a<b\)连边\(a\rightarrow b\),而且所有点入度为最多1,那么判掉有环的不合法情况,题目中的依赖关系就是一颗外向树森林,可以通过建一个另外的点向每棵树的根连边,能得到一颗外向树
然后就是dp,这里把打等号的一些相邻的数看成一个数,设\(f_{i,j}\)表示i点子树序列长度为j的方案,转移将儿子依次合并,即\(f_{x,l}\leftarrow f_{x,j}*f_{y,k}*g_{j,k,l}\)
上面的g是一个长度为j一个长度为k的序列合并成长度为l的序列方案数,转移枚举最后一个数是第一个序列的,第二个序列的或者是合并起来的
#include<bits/stdc++.h>
#define LL long long
#define db double
#define il inline
#define re register
using namespace std;
const int N=100+10,mod=1e9+7;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int to[N<<1],nt[N<<1],hd[N],dg[N],tot=1;
il void add(int x,int y)
{
++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot,++dg[y];
}
int f[N][N],g[N][N][N<<1],d[N],sz[N];
void dp(int x)
{
sz[x]=f[x][0]=1;
for(int h=hd[x];h;h=nt[h])
{
int y=to[h];
dp(y);
memset(d,0,sizeof(d));
for(int i=0;i<sz[x];++i)
for(int j=1;j<=sz[y];++j)
for(int k=1;k<=i+j;++k)
d[k]=(d[k]+1ll*f[x][i]*f[y][j]%mod*g[i][j][k]%mod)%mod;
sz[x]+=sz[y];
memcpy(f[x],d,sizeof(d));
}
for(int i=sz[x];i;--i) f[x][i]=f[x][i-1];
f[x][0]=0;
}
int n,m,e[N][2],ff[N];
il int findf(int x){return ff[x]==x?x:ff[x]=findf(ff[x]);}
bool v[N];
bool check(int x)
{
if(v[x]) return 0;
v[x]=1;
for(int h=hd[x];h;h=nt[h]) if(!check(to[h])) return 0;
v[x]=0;
return 1;
}
int main()
{
n=rd(),m=rd();
for(int i=1;i<=n;++i) ff[i]=i;
for(int i=1;i<=m;++i)
{
int x=rd(),z=(getchar()=='<'),y=rd();
if(!z) --m,--i,ff[findf(x)]=findf(y);
else e[i][0]=x,e[i][1]=y;
}
for(int i=1;i<=m;++i) add(findf(e[i][0]),findf(e[i][1]));
for(int i=1;i<=n;++i)
if(findf(i)==i&&!check(i)) return puts("0"),0;
for(int i=1;i<=n;++i)
if(!dg[i]&&findf(i)==i) add(n+1,i);
g[0][0][0]=1;
for(int i=0;i<=n;++i)
for(int j=0;j<=n;++j)
for(int k=1;k<=i+j;++k)
{
if(i) g[i][j][k]=(g[i][j][k]+g[i-1][j][k-1])%mod;
if(j) g[i][j][k]=(g[i][j][k]+g[i][j-1][k-1])%mod;
if(i&&j) g[i][j][k]=(g[i][j][k]+g[i-1][j-1][k-1])%mod;
}
dp(n+1);
int ans=0,lim=1;
for(int i=1;i<=n;++i) lim+=findf(i)==i;
for(int i=1;i<=lim;++i) ans=(ans+f[n+1][i])%mod;
printf("%d\n",ans);
return 0;
}
luogu P3240 [HNOI2015]实验比较的更多相关文章
- BZOJ 4013/Luogu P3240 [HNOI2015] 实验比较 (树形DP)
题目传送门 分析 放一个dalao博客: xyz32768 的博客,看完再回来看本蒟蒻的口胡吧(其实嘛-不回来也行) 精髓是合并的方案数的计算,至于为什么是Ci−1j−1\large C_{i-1}^ ...
- P3240 [HNOI2015]实验比较 树形DP
\(\color{#0066ff}{ 题目描述 }\) 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 \(N\) 张图片,编号为 \(1\) 到\(N\).实验分若 ...
- 【BZOJ4013】[HNOI2015]实验比较(动态规划)
[BZOJ4013][HNOI2015]实验比较(动态规划) 题面 BZOJ 洛谷 题解 看题目意思就是给你一棵树,连边表示强制顺序关系.然后你要给点染色,在满足顺序关系的情况下,将序列染成若干个颜色 ...
- 4013: [HNOI2015]实验比较
4013: [HNOI2015]实验比较 链接 分析: 首先把等号用并查集合并起来. 由于只存在最多一个质量不比i差的数,发现这是森林.若x<y,连边x->y.于是建虚拟根节点0. 然后树 ...
- [BZOJ4013][HNOI2015]实验比较(树形DP)
4013: [HNOI2015]实验比较 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 756 Solved: 394[Submit][Status] ...
- bzoj 4013: [HNOI2015]实验比较
Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...
- [HNOI2015]实验比较
Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...
- BZOJ4013 : [HNOI2015]实验比较
首先用并查集将等号缩点,然后拓扑排序判断有没有环,有环则无解,否则通过增加超级源点$0$,可以得到一棵树. 设$f[x][y]$表示$x$子树里有$y$种不同的数字的方案数,由底向上DP. 对于当前点 ...
- Luogu P3239 [HNOI2015]亚瑟王
题目链接 \(Click\) \(Here\) 期望神题.最开始一直尝试推朴素一点的,逻辑上的\(DP\)式子,后来发现一直出锅,可能是我的式子没容斥对... 题解中给出的想法是这样的: 首先,如果直 ...
随机推荐
- css 圆形头像
方法一:背景图片(推荐) 好处是,图片长宽不等的情况下图片不会变形 .ui-photo { width: 100px; height: 100px; background: url("img ...
- (三)orcale体系结构
https://www.cnblogs.com/chengxiao/p/5904783.html 一.什么是Oracle数据库? 众所周知,Oracle DataBase是一款关系型数据库管理系统(不 ...
- 团体程序设计天梯赛(CCCC) L3014 周游世界 BFS证明
团体程序设计天梯赛代码.体现代码技巧,比赛技巧. https://github.com/congmingyige/cccc_code
- PMP证书的获取,不知道10大注意事项会吃亏
作为一个已经考过PMP的小项目经理我来说,近来接到不少咨询PMP的,有咨询考试事宜的,也有咨询后续的换审和PDU的,今天我这边就说说PMP项目管理证书要获取的一些注意事项,不注意的话可是会吃大亏的. ...
- c#的一些快捷键
ctrl+c+s 外加代码 F12 转到定义 ctrl+F5调试 一些补全命令 svm Main函数的补全命令 prop 属性的补全命令
- centos 7 安装appache 服务器
一.安装Apache程序,一般有三种安装方式:1.直接网络安装:2.下载rpm包,上传至服务器进行安装:3.通过原代码编译安装: yum -y install httpd rpm -qa | grep ...
- IIS异常:CS0016: 未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\.。。”--“拒绝访问
CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/.........dll” ...
- DB2常用命令整理
1.基本命令 查看命令选项list command options信息帮助SQL statement例子:statement =30081SQL30081启动当前的DB2数据库管理实例db2start ...
- opencv: 线性拟合
opencv提供了fitline函数用于直线拟合,原型为: C++: void fitLine(InputArray points, OutputArray line, int distType, d ...
- M1-SaltStack&Flask-Day4
1.virtualenv 虚拟环境 2.virtualenv env1 -p= 解释器路径 3. 进入Scripts 执行activate 激活配置 4.执行deactivate 取消激活配置 2.1 ...