BZOJ 3167 [Heoi2013]Sao ——树形DP
BZOJ4824的强化版。
改变枚举的方案,使用前缀和进行DP优化。
然后复杂度就是$O(n^2)$了。
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (ll i=j;i<=k;++i)
#define D(i,j,k) for (ll i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define maxn 1050
const ll md=1000000007; ll h[maxn<<1],to[maxn<<1],ne[maxn<<1],en=0,n;
ll siz[maxn],tmp[maxn],w[maxn],lim[maxn];
ll dp[maxn][maxn],c[maxn][maxn],suf[maxn][maxn],pre[maxn][maxn];
char s[maxn];
void add(ll a,ll b,ll c)
{
to[en]=b;ne[en]=h[a];w[en]=c;h[a]=en++;
} ll C(ll n,ll m)
{
if (n<0||m<0) return 0;
return c[n][m];
} void Tree_DP(ll o,ll fa)
{
dp[o][1]=1;siz[o]=1;
for (ll i=h[o];i>=0;i=ne[i])
if (to[i]!=fa){
Tree_DP(to[i],o);
F(j,0,siz[o]+siz[to[i]]+2) tmp[j]=0;
if (w[i]==1)
{
F(j,1,siz[o])
if (dp[o][j]) F(_j,j,j+siz[to[i]]-1)
tmp[_j]+=(((dp[o][j]*suf[to[i]][_j-j+1])%md*C(_j-1,j-1))%md*C(siz[o]+siz[to[i]]-_j,siz[o]-j))%md,tmp[_j]%=md;
}
else
{
F(j,1,siz[o])
if (dp[o][j]) F(_j,j+1,siz[to[i]]+j)
tmp[_j]+=(((dp[o][j]*((suf[to[i]][1]-suf[to[i]][_j-j+1])%md+md))%md*C(_j-1,j-1))%md*C(siz[o]+siz[to[i]]-_j,siz[o]-j))%md,tmp[_j]%=md;
}
siz[o]+=siz[to[i]];
F(j,0,siz[o]) dp[o][j]=(tmp[j]%md+md)%md;
}
suf[o][siz[o]]=dp[o][siz[o]];
D(i,siz[o],1) suf[o][i]=(suf[o][i+1]+dp[o][i])%md;
} void Finout()
{
freopen("in.txt","r",stdin);
freopen("wa.txt","w",stdout);
} ll t; int main()
{
scanf("%lld",&t);
c[1][0]=1;c[1][1]=1;c[0][0]=1;
F(i,2,maxn-1)
{
c[i][0]=1;
F(j,1,maxn-1) c[i][j]=(c[i-1][j]+c[i-1][j-1])%md;
}
while (t--)
{
memset(dp,0,sizeof dp);
memset(suf,0,sizeof suf);
memset(h,-1,sizeof h);en=0;
scanf("%lld",&n);
F(i,2,n)
{
ll a,b,c;
scanf("%lld",&a);
a++;
scanf("%s",s);
scanf("%lld",&b);b++;
switch(s[0])
{
case '<':c=1;break;
case '>':c=-1;break;
}
add(a,b,c); add(b,a,-c);
}
Tree_DP(1,-1);
ll ans=0;
F(i,0,n) ans+=dp[1][i],ans%=md;
printf("%lld\n",(ans%md+md)%md);
}
}
BZOJ 3167 [Heoi2013]Sao ——树形DP的更多相关文章
- 3167: [Heoi2013]Sao [树形DP]
3167: [Heoi2013]Sao 题意: n个点的"有向"树,求拓扑排序方案数 Welcome to Sword Art Online!!! 一开始想错了...没有考虑一个点 ...
- BZOJ 3167: [Heoi2013]Sao
3167: [Heoi2013]Sao Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 96 Solved: 36[Submit][Status][D ...
- [BZOJ3167][P4099][HEOI2013]SAO(树形DP)
题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...
- 洛谷 4099 [HEOI2013]SAO——树形DP
题目:https://www.luogu.org/problemnew/show/P4099 结果还是看了题解才会…… 关键是状态,f[ i ][ j ] 表示 i 子树. i 号点是第 j 个出现的 ...
- Bzoj 1131[POI2008]STA-Station (树形DP)
Bzoj 1131[POI2008]STA-Station (树形DP) 状态: 设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移. 发现儿子的深度及其自己的深度\(-1\) 其余 ...
- [HEOI2013]SAO(树上dp,计数)
[HEOI2013]SAO (这写了一个晚上QAQ,可能是我太蠢了吧.) 题目说只有\(n-1\)条边,然而每个点又相互联系.说明它的结构是一个类似树的结构,但是是有向边连接的,题目问的是方案个数,那 ...
- BZOJ 4726: [POI2017]Sabota? 树形dp
4726: [POI2017]Sabota? 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4726 Description 某个公司有n ...
- bzoj 2286(虚树+树形dp) 虚树模板
树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5002 Sol ...
- BZOJ 4472 [Jsoi2015]salesman(树形DP)
4472: [Jsoi2015]salesman Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 417 Solved: 192[Submit][St ...
随机推荐
- CPP-基础:C/C++数组名与指针的区别
2005-08-23 08:36 来源:天极网 作者:宋宝华 责任编辑:方舟·yesky 引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很 ...
- 常用的ement语法
缩写语法: 介绍:Emmet 使用类似于 CSS 选择器的语法描述元素在生成的文档树中的位置及其属性. 声明:第一次写博客大家多多关照,如有错误或者需要补充的请到评论里留言,谢谢大家! 快速生成htm ...
- java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法
package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...
- vue 正则判断
value=value.replace(/[^\d.]/g,'').replace(/\.{2,}/g,'.').replace('.','$#$').replace(/\./g,'').replac ...
- 《effective c++》问题总结
04 确定对象被使用前已先被初始化 1.static/heap/stack对象 2.trivial对象 3.模板隐式具现化 implicit template instantiations 4.Sin ...
- 重温经典之赫夫曼(Huffman)编码
先看看赫夫曼树假设有n个权值{w1,w2,…,wn},构造一个有n个叶子结点的二叉树,每个叶子结点权值为wi,则其中带权路径长度WPL最小的二叉树称作赫夫曼树或最优二叉树. 赫夫曼树的构造,赫夫曼最早 ...
- Service Mesh是什么技术
https://blog.csdn.net/weixin_38044696/article/details/80257488 Service Mesh是什么技术 2018年05月09日 22:07:4 ...
- Linux远程传输命令scp
指令:scp在不同的linux主机间复制文件带有Security的文件copy,基于ssh登录. 有些linux发行版没有自带scp,因此需要安装scp# yum -y install openssh ...
- php生成zip压缩文件的方法,支持文件和压缩包路径查找
/* * new creatZip($_dir,$_zipName); *@ _dir是被压缩的文件夹名称,可使用路径,例 'a'或者'a/test.txt'或者'test.txt' *@ _zipN ...
- LeetCode(225) Implement Stack using Queues
题目 Implement the following operations of a stack using queues. push(x) – Push element x onto stack. ...