3167: [Heoi2013]Sao [树形DP]
3167: [Heoi2013]Sao
题意:
n个点的“有向”树,求拓扑排序方案数
Welcome to Sword Art Online!!!
一开始想错了...没有考虑一个点的孩子可以排在父亲后...
为了能转移,给状态加一维,\(f[i][j]\)表示子树i,i排在第j位的方案数
然后,很像树形背包啊,转移枚举孩子子树中k个点在i之前,更新\(f[i][j+k]\)
严格做到每次合并复杂度为 “已经合并大小*正要合并进去的大小”,那么这个复杂度就是\(O(n^2)\)的,因为一个点对只贡献一次
真不敢相信我以前的树形背包都写的是\(O(n^3)\)
注意需要用一个新数组保存当前更新得到的值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 1005, P = 1e9+7;
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
}
int n, u, v, c[N][N];
char s[5];
struct edge{int v, ne, p;} e[N<<1];
int cnt, h[N];
inline void ins(int u, int v) { //printf("ins %d %d\n", u, v);
e[++cnt] = (edge){v, h[u], 1}; h[u] = cnt;
e[++cnt] = (edge){u, h[v], 0}; h[v] = cnt;
}
int f[N][N], size[N], f_pre[N][N], f_suf[N][N], g[N];
void dp(int u, int fa) {
size[u] = 1; f[u][1] = 1;
for(int i=h[u]; i; i=e[i].ne) {
int v = e[i].v, p = e[i].p;
if(v == fa) continue;
dp(v, u);
for(int j = 0; j <= size[u] + size[v]; j++) g[j] = 0;
for(int j = 1; j <= size[u]; j++)
for(int k = 0; k <= size[v]; k++) {
ll t = p ? f_suf[v][k+1] : f_pre[v][k];
g[j+k] = (g[j+k] + (ll) c[j-1+k][k] * c[size[u]-j+size[v]-k][size[v]-k] %P * f[u][j] %P * t) %P;
}
for(int j = 0; j <= size[u] + size[v]; j++) f[u][j] = g[j];
size[u] += size[v];
}
for(int i = 1; i <= size[u]; i++) f_pre[u][i] = (f_pre[u][i-1] + f[u][i]) %P;
for(int i = size[u]; i >= 1; i--) f_suf[u][i] = (f_suf[u][i+1] + f[u][i]) %P;
}
int main() {
freopen("in", "r", stdin);
int T = read();
c[0][0] = 1;
for(int i=1; i<N; i++) {
c[i][0] = 1;
for(int j=1; j<N; j++) c[i][j] = (c[i-1][j] + c[i-1][j-1]) %P;
}
while(T--) {
n = read();
memset(f, 0, sizeof(f));
memset(f_pre, 0, sizeof(f_pre));
memset(f_suf, 0, sizeof(f_suf));
cnt = 0; memset(h, 0, sizeof(h));
for(int i=1; i<n; i++) {
u = read()+1; scanf("%s", s); v = read()+1;
if(s[0] == '<') ins(u, v); else ins(v, u);
}
dp(1, 0);
printf("%d\n", f_pre[1][size[1]]);
}
}
3167: [Heoi2013]Sao [树形DP]的更多相关文章
- BZOJ 3167 [Heoi2013]Sao ——树形DP
BZOJ4824的强化版. 改变枚举的方案,使用前缀和进行DP优化. 然后复杂度就是$O(n^2)$了. #include <map> #include <cmath> #in ...
- [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 3167: [Heoi2013]Sao
3167: [Heoi2013]Sao Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 96 Solved: 36[Submit][Status][D ...
- [HEOI2013]SAO(树上dp,计数)
[HEOI2013]SAO (这写了一个晚上QAQ,可能是我太蠢了吧.) 题目说只有\(n-1\)条边,然而每个点又相互联系.说明它的结构是一个类似树的结构,但是是有向边连接的,题目问的是方案个数,那 ...
- [BZOJ3167][HEOI2013]SAO[树dp+组合数学]
题意 给定 \(n\) 个节点和 \(n-1\) 个限制,每个节点有一个权值,每个限制形如:\(a_i< a_j\) ,问有多少个 \(1\) 到 \(n\) 排列满足要求. \(n\leq 1 ...
- [BZOJ4824][CQOI2017]老C的键盘(树形DP)
4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 193 Solved: 149[Submit][Statu ...
- [提升性选讲] 树形DP进阶:一类非线性的树形DP问题(例题 BZOJ4403 BZOJ3167)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7337179.html 树形DP是一种在树上进行的DP相对比较难的DP题型.由于状态的定义多种多样,因此解法也五 ...
- 树形dp专题总结
树形dp专题总结 大力dp的练习与晋升 原题均可以在网址上找到 技巧总结 1.换根大法 2.状态定义应只考虑考虑影响的关系 3.数据结构与dp的合理结合(T11) 4.抽直径解决求最长链的许多类问题( ...
随机推荐
- 一些有用的stl知识《acm程序设计》
accepted 通过 Presentation Error 输出格式错误 Wrong Answer 答案错误 Runtime Error 多为数组访问越界 程序运行时 ...
- [国嵌攻略][107][Linux进程管理子系统]
进程与程序 1.程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体. 2.进程:是一个执行中的程序,它是一个动态的实体. 进程四要素 1.有一段程序供其执行.这段程序不一定是某个进程所 ...
- 2017-6-14 踩坑小结(Android文件读写 相关问题)
填坑 getSlotFromBufferLocked: unknown buffer: 0xab7115e0 1. 在棉花糖(6.0)上莫名出现 未知缓冲 错误,百度了一下,貌似这个是Android6 ...
- Oracle_建表
Oracle_建表 --设计要求: --建立一张用来存储学生信息的表 --字段包含学号.姓名.性别,年龄.入学日期.班级,email等信息 create table student( ...
- DT_修改注册项
所用语法: /* */用于注释掉某些非必要的判断语句 修改的文件及路径如下: 前台: 文件路径:/根目录/lang/zh-cn/ 编辑文件:member.inc.php 修改其中一些提示信息(如,将[ ...
- 遇到安装app不识别的情况
一般->blokfile->证书设定设置
- -------- Rootkit 核心技术——利用 nt!_MDL 突破 KiServiceTable 的只读访问限制 Part II --------
------------------------------------------------------------------------------------------- 本篇开始进入正题 ...
- List源码学习之ArrayList
ArrayList 内部结构为一个可重复的对象数组(可存空对象). 内部有以下几个参数: ;/** * 用于空实例的共享空数组实例 */private static final Object[] EM ...
- 基于 HTML5 的 3D 工控隧道案例
隧道的项目我目前是第一次接触,感觉做起来的效果还蛮赞的,所以给大家分享一下.这个隧道项目的主要内容包括:照明.风机.车道指示灯.交通信号灯.情报板.消防.火灾报警.车行横洞.风向仪.COVI.微波车检 ...
- 新建maven项目,JRE System Library[J2SE-1.5]
上篇博文中搭建了maven多模块项目,发现全是JRE System Library[J2SE-1.5],如图. 怎么避免这种情况呢? windows-preferences-maven-user se ...