传送门

首先根据题目条件,题目中如果是=的点可以缩起来,然后\(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]实验比较的更多相关文章

  1. BZOJ 4013/Luogu P3240 [HNOI2015] 实验比较 (树形DP)

    题目传送门 分析 放一个dalao博客: xyz32768 的博客,看完再回来看本蒟蒻的口胡吧(其实嘛-不回来也行) 精髓是合并的方案数的计算,至于为什么是Ci−1j−1\large C_{i-1}^ ...

  2. P3240 [HNOI2015]实验比较 树形DP

    \(\color{#0066ff}{ 题目描述 }\) 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 \(N\) 张图片,编号为 \(1\) 到\(N\).实验分若 ...

  3. 【BZOJ4013】[HNOI2015]实验比较(动态规划)

    [BZOJ4013][HNOI2015]实验比较(动态规划) 题面 BZOJ 洛谷 题解 看题目意思就是给你一棵树,连边表示强制顺序关系.然后你要给点染色,在满足顺序关系的情况下,将序列染成若干个颜色 ...

  4. 4013: [HNOI2015]实验比较

    4013: [HNOI2015]实验比较 链接 分析: 首先把等号用并查集合并起来. 由于只存在最多一个质量不比i差的数,发现这是森林.若x<y,连边x->y.于是建虚拟根节点0. 然后树 ...

  5. [BZOJ4013][HNOI2015]实验比较(树形DP)

    4013: [HNOI2015]实验比较 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 756  Solved: 394[Submit][Status] ...

  6. bzoj 4013: [HNOI2015]实验比较

    Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...

  7. [HNOI2015]实验比较

    Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...

  8. BZOJ4013 : [HNOI2015]实验比较

    首先用并查集将等号缩点,然后拓扑排序判断有没有环,有环则无解,否则通过增加超级源点$0$,可以得到一棵树. 设$f[x][y]$表示$x$子树里有$y$种不同的数字的方案数,由底向上DP. 对于当前点 ...

  9. Luogu P3239 [HNOI2015]亚瑟王

    题目链接 \(Click\) \(Here\) 期望神题.最开始一直尝试推朴素一点的,逻辑上的\(DP\)式子,后来发现一直出锅,可能是我的式子没容斥对... 题解中给出的想法是这样的: 首先,如果直 ...

随机推荐

  1. ava EE 7 - Injection into Runnable/Callable object ejb entityManager Concurrency ManagedExecutorService 异步调用如何获取context

    或者直接把 MyTask类内嵌如MyBean中,这样可以在myBean中inject 数据库连接,在内嵌类内访问. java ee 引入了并发执行.因为是在服务器执行并发,所以要用java ee包里面 ...

  2. Vim保存时权限不足

    保存时权限不足,由于打开时忘记在命令前添加sudo.我们并不需要放弃修改,从新以root权限打开 解决方案 命令模式使用:w !sudo tee %提权,保存

  3. java ssl 使用不同的加密套件,对性能影响很大

    一直以来都是使用java默认的[加密套件]来处理ssl请求,突然有一天我尝试显式的设置了一组加密套件后,发现图片显示的速度明显快了一倍左右. 经过使用几组不同的加密套件测试后,发现使用 TLS_ECD ...

  4. 关于数据结构,剑指offer上面的

    我很喜欢那些javascript解决的编程题,感觉非常的有意思.我在博客园上面看到了一个同学的博客,他一共发了34篇剑指offer的编程题,还给出了非常详细的解答. 接下来的工作,我做的就是搬运工,不 ...

  5. css实现文本溢出显示省略号

    看到很多网站上的文章列表只显示一部分,之后就是一个阅读全文链接,或者是以一个省略号结尾.今天就说说单行文本,多行文本溢出时怎么显示省略号? 单行 overflow: hidden; white-spa ...

  6. R语言绘图(FZ)

    P-Value Central Lmit Theorem(CLT) mean(null>diff) hist(null) qqnorm(null) qqline(null) pops<-r ...

  7. Ubuntu下使用sublime text进行py开发

    放弃了,半天弄不出一个方便的开放环境,还是现成的iDE方便 下载方法 https://www.sublimetext.com/docs/3/linux_repositories.html 首先安装Pa ...

  8. js怎么获取微信浏览器内容的高度

    通过window对象来得到窗口相关的内外款高度信息,如下: outerHeight属性设置或返回一个窗口的外部高度,包括所有界面元素(如工具栏/滚动条).outerWidth属性设置或返回窗口的外部宽 ...

  9. Going Home POJ - 2195 (最小费用最大流)

    On a grid map there are n little men and n houses. In each unit time, every little man can move one ...

  10. 关键字(6):trigger触发器

    trigger是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行.触发器经常用于加强数据的 ...