动态规划-树形
Endless_Way
这个作者很懒,什么都没留下…
展开
-
BZOJ 4007 [JLOI2015]战争调度
树形DP+状压+搜索。刚开始想了一些奇怪的树形DP,都没法做,后来发现是自己对题目理解有误。如果枚举所有点的决策,那是O(22n)O(2^{2^n})。发现对于一个最底层节点,他的贡献只和一条链有关,于是可以考虑从这里下手。对于一个点i,如果他的所有上司的状态已经确定,那么他的左右子树的决策将互不影响,于是可以用DFS枚举一整条链的状态并进行DP。记f[i][j]表示i结点为根的子树中去j个参加战争原创 2016-08-17 15:57:21 · 672 阅读 · 0 评论 -
BZOJ 4813 [Cqoi2017]小Q的棋盘
树形DP记f[i][j]f[i][j]表示在i的子树里走j步最多能走多少个点。实际上的决策一定是先进一个i的儿子节点的子树,然后出来,再进一个子树,再出来……最后进一颗子树,也许还会出来。枚举在外面走多少步,转移到最后进去的子树即可。#include<cstdio>#include<algorithm>#define N 105using namespace std;namespace ru原创 2017-04-28 20:54:35 · 659 阅读 · 0 评论 -
BZOJ 4316 小C的独立集
仙人掌DP记f[i][0/1]表示i取不取,子仙人掌的最大答案。树边直接转移,环边扫一圈转移。感觉自己很智障,DP方程没什么问题,倒是tarjan写挂了???直接把栈里剩下的东西拿来当环上的东西也是没救了……#include<cstdio>#include<algorithm>#define N 500005#define cmin(u,v) ((u)>(v)?(u)=(v):0)using原创 2017-04-13 14:25:43 · 454 阅读 · 0 评论 -
51Nod 1789 跑的比谁都快
树形DP+决策单调性考虑优化DP。 构一条链的数据,打表,发现决策点单调,因此套决策单调性即可O(nlogn)O(nlogn)。知识漏洞,以前对决策单调性的理解一直存在误区。决策单调性是指对于 i < j,那么一定有i的决策点<=j的决策点,但并不保证决策函数是单峰的。因此不能直接从上一个决策点开始枚举,遇到不优就停下来。正确做法是主动转移,然后二分。详见《1D/1D 动态规划优化初步》里面的第一原创 2017-03-11 18:10:22 · 754 阅读 · 0 评论 -
BZOJ 3162 独钓寒江雪
树哈希+树形DP+组合计数VFK题解里用的是直径的中心,然而我用的是重心,不过基本没区别。所有独立集计数记f[i][0/1]表示i取或不取,子树内独立集个数。要求本质不同,那我们希望拿一个点r出来当根,尽量让以r为根的有根树形态唯一,即不存在树内一点u,使得u当根和r当根时结构一样。重心是一个不错的选择,因为一棵树重心至多两个。对于重心有两个的情况大力分类讨论即可,前面的做法和重心唯一的做法一样。考原创 2017-02-25 14:02:29 · 391 阅读 · 0 评论 -
CF 70E Information Reform
树形DP因为博主蒟蒻变懒了,以后就只写一些不好想的(丧)题题解,而不会啥题解都写了吧。。。注意到每一个点都要找一个点和自己对应,并产生代价,于是可以记f[i][j]表示i强制对应j时i子树的最小答案(包括建j的k代价),再记一个best[i]表示j取到best[i]时,f[i][j]最小f[i][j] = Sigma { min( f[s][j] - k, f[s][best[s]] ) }这样第一原创 2016-10-31 16:13:23 · 460 阅读 · 0 评论 -
BZOJ 2657 [Zjoi2012]旅游(journey)
DP最长链不会证明的玄学题。我们令每个三角形变成一个点,相邻三角形连边,一定是构成一棵树(如果有环,那么中间就会有端点,显然不行)然后就跑最长链了(不会证明)#include<cstdio>#include<algorithm>#include<map>#define N 200005using namespace std;map<pair<int,int>,int> mapp;stru原创 2016-10-29 13:52:03 · 334 阅读 · 0 评论 -
BZOJ 1131 [POI2008]Sta
树形DP记f[i]为i子树到i距离和 记g[i]为所有节点到i距离和 DP两次即可#include<cstdio>#define N 1000005#define ll long longusing namespace std;struct edge{int next,to;}e[N<<1];int ecnt=1, last[N], siz[N], n, pos;ll f[N], g原创 2016-10-15 10:55:31 · 374 阅读 · 0 评论 -
BZOJ 3522 & 4543: [POI2014]Hotel
指针优化树形DPBZOJ3522的n只有5000,可以随便用一个n^2的大暴力搞过去,就不讲了。BZOJ4543好丧啊,看到题解我当时就震惊了,题解点我n有十万,使人一看到就会放弃一些树形DP的思路,而正解正是树形DP,难点就在内存和时间的优化。可以证明复杂度是O(n),详见上面的题解呀。#include<cstdio>#include<cstring>#define N 5005#defin原创 2016-10-21 23:48:41 · 518 阅读 · 0 评论 -
BZOJ 4455 & UOJ 185 [ZJOI2016]小星星
容斥原理+树形DP首先有一个暴力的想法,f[i][j][sta]表示树中i与图中k对应,i的子树与sta(状压)对应,然后大力转移。这需要枚举子集,复杂度约O(n2∗3n)O(n^2*3^n)考虑枚举状态sta表示图中可用点范围,记f[i][j]表示i和j对应,但对应可以重复,即可以不一一对应。最终答案就是与全集一一对应的方案数。考虑容斥,记SnS_n表示不使用图中节点n的方案,显然这些都是不合理的原创 2016-09-10 11:47:53 · 415 阅读 · 0 评论 -
BZOJ 3677 & UOJ 105 [APIO2014]Beads and wires
换根DP做这题真是艰辛啊- -如果把刚开始的第一个珠子定为根,那么Insert操作只会使得蓝线上的三个珠子呈“爷爷,父亲,自己”的形式(也就是由上向下的三代),于是可以DP,记f[i][0]表示i不属于蓝线中点、f[i][1]表示i属于蓝线中点的i子树的最大答案。于是可以对于每个点当作根进行一次DP,DP的复杂度O(n),那么总复杂度O(n^2)是不科学的。对换根过程进行优化!维护一个g[i][1/原创 2016-08-11 17:43:48 · 608 阅读 · 0 评论 -
BZOJ 1912 [Apio2010]patrol 巡逻
网络上大部分都是用最长链做的,但是我(因为太弱了)并不能理解这样的正确性。。。所以就打了个树形DP。k=1时,答案=2*(n-1)-最长链长度+1 k=2时,发现如果两条链相交,相交的部分并不能减一,那怎么DP?发现一种情况,只要把相交的部分丢掉,剩下的两半也是两个链——也就是说一定会有两个不交的链等效于任意两个相交的链。那问题就变成求不相交两条链的最大长度。记f[i][j][k]表示i的子树中,原创 2016-08-06 16:47:50 · 289 阅读 · 0 评论 -
BZOJ 4557 [JLoi2016]侦察守卫
树形DP。f[i][j]:以i为根的子树中,至少前j层已经被全部覆盖,做完i这一整棵子树的最小代价。 g[i][j]:i节点向上至少 j层被覆盖,做完i的子树的最小代价。可以根据f直接写出方程,此时唯一需要的就是f[i][0]的初始化,引入g即可解决。DP方程详见代码,注释已打。打完这题交上去之后蜜汁rank3,刷常之后成功rank1^_^!你猜下面的代码是rank几的#include<cstdi原创 2016-08-27 12:55:13 · 1836 阅读 · 2 评论 -
BZOJ 1040 [ZJOI2008]骑士
由于一个骑士只会痛恨另一个骑士,所以痛恨的关系等于骑士数量。可知这是一张由n个点,n条边组成的环套树森林。环套树是什么?环套树是一种有且只有一个环的图(并没有找到环套树的标准定义-_-)。大概脑补一下,就是一个环,上面的一些节点套着一棵树。。。记f[i][1或0]表示节点i取或不取,它以及他的子树的贡献答案。环套树问题一般都涉及拆环上的边。此题中,可以随意删除环上的一条边,记被删除的边两端节点为u,原创 2016-08-02 16:26:53 · 299 阅读 · 0 评论 -
BZOJ 4346: [POI2016]Nadajniki
树形DP好久没写正常的题解了,于是写一发。记f[i][j=0/1/2/3/4][k=0/1/2]表示以i为根的子树,j=0表示i和i子树中与i相邻的点都没有放,j=1和j=2分别表示i这个点放了1或2个,j=3和j=4分别表示i这个点没放但i子树中与i相邻的点放了1或2个,k表示与i相邻的点中还缺了几个,即至少还要放几个。最麻烦的地方就是状态之间的转移,手推清楚即可。#includ...原创 2018-08-16 22:56:55 · 220 阅读 · 0 评论