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 ...
随机推荐
- python plt 保存jpg出错
pip install pillow就可以解决
- python_95_类变量的作用及析构函数
参考:http://www.cnblogs.com/alex3714/articles/5188179.html #类变量的用途:大家共有的属性,节省内存 class Person(): cn='Ch ...
- LLDB详解
LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用LLDB,可以让你debug事半功倍 L ...
- vue 点击下拉框
data: { hide:false, zhi:"全部" }, <div class="item"> <div class="c2c ...
- ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES) MYSQL 新建用户 无法登录 问题解决方法
使用mysql ,出现新建账户无法登录问题 查看 user列表中,有部分账户没有设置密码,将全部重新设置一遍密码,然后还是无法登录. 使用命令 update user set password=pas ...
- windows server 服务器 环境配置
自动备份 xcopy d:\web\zhiku\*.* d:\bak\web\zhiku\%date:~,4%%date:~5,2%%date:~8,2%\ /S /I
- python-for循环与while循环
while 循环 格式: while 条件 为 True: 代码块 while True: rayn_age = 18 age = input('请输入你的年龄:') age = int(age) i ...
- apply 与 lambda
Python中的lambda和apply用法 https://blog.csdn.net/anshuai_aw1/article/details/82347016
- STM32——PWM基本知识及配置过程
将通用定时器分为四个部分: 1,选择时钟 2,时基电路 3,输入捕获 4,输出比较 本节定时器PWM输出主要涉及到定时器框图右下方部分,即输出比较部分 和上一讲相同,时基时钟来源于内部默认时钟 对此有 ...
- redis--py操作redis【转】
Python操作redis 请给作者点赞--> 原文链接 python连接方式:点击 下面介绍详细使用 1.String 操作 redis中的String在在内存中按照一个name对应一个val ...