树上的dp啊,其实和序列上差不多嘛,DAGDAG,刷一波水题吧,我这种随时准备AFO的选手只会做水题了吧,,感觉没有前途了,,
题库:bzoj:1017 1037 1040 1060 1063 1065 1093 1123 1131 1509 1791 1812 1924 1907
2067 2097 2152 2314 2435 2500 2657 2878
3206 3037 3124 3162 3522 3566 3611 3829
4013 4027 4033
以上必做
hzwer:http://hzwer.com/category/c/dp/treedp/page/4
poj:
codeforces:
topcoder:
codechef:
以上必看,难题必做
bestcoder:
spoj,uva,
其它:
注意:(!!!)的是比较懒还没有仔细思考或者不太会的
(题解)表明多少看了一下题解
以上还没有实践AC错误在所难免请谅解,毕竟这就是嘴巴OI选手的最大成就了,,,我是嘴巴OI我骄傲!随时更新,,,
题目:
1.题目名称:1017: [JSOI2008]魔兽地图DotR
通过情况:unAC
关键词:树形dp
思路:考虑到树形结构关系,可以采用树形dp来做,怎么做呢?考虑到钱数,个数的限制,那么只能作为状态出现了,定义:f[i][money][num]表示以i
为根的子树,钱数限制是money,要做num个装备i的最大力量值,考虑转移,首先要统计出合成一个i装备的金钱数m[i],然后用树形背包进行转移,对于每个son,考虑f[son][money1][num + k],暴力枚举钱数对应的力量值,要减去那些被合成为fa的,取最大值,然后背包出解,这样状态数:O(nm*max(num)),背包转移,O(n*m^2) = O(50*(2000)^2) = O(2*10^8)感觉要完啊,,,
注意情况:无
2.题目名称:1037: [ZJOI2008]生日聚会Party
通过情况:unAC
关键词:dp
思路:可以观察到k非常小,可以作为状态使用,定义f[i][a][s1][s2]表示到第i个点,有a个男孩,情况合法,以i为尾的男孩最多比女孩多s1,女孩最多比男孩多s2的方案数,转移分情况讨论,注意要合法,初始时f[0][0][0][0] = 1,也有可能有组合数学的做法?可以思考一下
复杂度:O((n + m)*n*k^2) = O(1.8 * 10^7)
注意情况:注意边界
3.题目名称:1040: [ZJOI2008]骑士
通过情况:unAC
关键词:基环+外向树dp(树形dp)
思路:考虑到每个点出度为1,那么一定形成了若干联通快,每个块内是基环+外向树的形式,然而怎么dp这个玩意呢?找出环上任意一条边,断开它,建树进行dp,分两种情况讨论,一种是根不选,相邻的那个断边点任意,另一种是根选,另一个点不能选,把联通快的值加起来就是答案了
复杂度:O(n)
总结:模型出度为1对应基环,研究基环外向树相关,环内容相关
注意情况:无
4.题目名称:1060: [ZJOI2007]时态同步
通过情况:unAC
关键词:树形dp
思路:题目等价于“修改最少次数边权,使根到每个叶子节点长度相同”明显可以dp,定义f[i] 表示以i为根的子树满足题目要求所需要的最少次数,但只有f数组是没法转移的,设g[i]为当次数最小时根到叶子节点的长度,这样就可以转移了,正确性是显然的,因为修改节点i的子树内的边使其满足条件的次数<=子树内最小次数+修改i的向上一条边的边的次数。
总结:注意dp时有时无法转移,需要辅助数组互相转移,应仔细研究这一类问题
注意情况:无
5.题目名称:1063: [Noi2008]道路设计
通过情况:unAC(!!!)
关键词:树形dp
思路:目前不会
总结:
注意情况:
6.题目名称:奥运物流
通过情况:unAC(题解)
关键词:
思路:
注意情况:
7.题目名称:1093: [ZJOI2007]最大半连通子图
通过情况:unAC(题解)
关键词:dp 图论 tarjan缩点 结论题
思路:很明显我们要缩点,然后形成一个DAG,我们探究题目中的“最大半连通子图”具有什么性质,我是看了题解才知道竟然是满足能成为一条链,不知道怎么直接观察得知的,可能是需要爆搜小数据或者猜想特殊情况吧,感觉自己非常不擅长结论题,然而一旦知道了,证明还是非常简单的,用反证法,考虑缩点后的DAG,把任意一个半连通子图拿出来,搞一条子图的最长链,假设有一些点未被包含,然后根据几个题目条件:1.不含有环,是DAG 2.不会形成一个更长的链,即额外点不能被一条新的链包含,分情况讨论直接推出矛盾就好。由以上可以得知一条链和“最大半连通子图”一一对应,于是在DAG上dp求最长链就好了,记录方案数一样dp。
复杂度:O(n)
注意情况:学习图论相关,练习猜想的能力,做结论题
8.题目名称:4033: [HAOI2015]T1
通过情况:unAC
关键词:费用提前计算树形dp
思路:很明显是我曾经根本不会做的那种dp,当前状态对未来产生影响,然而终态固定,考虑费用提前计算(原谅我至今不能理解其正确性,希望神犇指点),首先考虑补集转换,将题目中的x*x + y*y变化为(x+y)^2 - 2xy,(好吧还是直接做吧那样好像很傻但是一种思想)f[i][j]表示以i为根的子树选k个黑点产生的黑白两点的最大贡献,于是提前计算费用,两种决策:1.i是白色,那么背包一下子节点,i的父亲边贡献为子树内外的黑点对+白点对个数和 2,i是黑色,背包不一样而已实际上和1的计算方式一样
复杂度:O(nk)+O(nk) = O(10^6)
总结:深入思考费用提前计算dp,做相应题目,理解其正确性
注意情况:无
9.题目名称:1123: [POI2008]BLO
通过情况:unAC(!!!)
关键词:树形dp dfs树
思路:我没有深入思考这道题,实际上我不太会,我只会一种暴力的做法:以每个点为根dfs一遍,形成一颗dfs树,该点答案就是根的子树个数的组合,正确性是显然的,原因是dfs树只有反祖边,同一个子树一定联通,不同子树直接一定不连通,复杂度O(n^2),显然会TLE。于是我觉得正解一定是只dfs一遍,然后在dfs树上维护答案,具体怎么维护我还没有想出来,有时间仔细想想吧。
总结:dfs树的研究
注意情况:无
10.题目名称:1131: [POI2008]Sta
通过情况:unAC
关键词:树的换根 dp
思路:我这种智障型选手也只会做这样的水题了吧。这是经典的树的换根操作,和树形dp结合,非常简单。直接dfs两遍转移就好。
总结:研究树的换根操作
注意情况:无
11..题目名称:1509: [NOI2003]逃学的小孩
通过情况:unAC(!!!)
关键词:树形dp
思路:没啥好的想法吧,关键是枚举中间点?感觉距离限制让我不太会啊,还需要思考吧。
注意情况:无
12.题目名称:1791: [Ioi2008]Island 岛屿
通过情况:unAC(!!!(
关键词:树形dp
思路:妈呀竟然没读懂题,,,主要是太没耐心了,有时间做做
注意情况:无
13.题目名称:1812: [Ioi2005]riv
通过情况:unAC
关键词:费用提前计算树形dp
思路:不多说了吧,是这类题型的裸题了吧,
注意情况:无
14.题目名称:1907: 树的路径覆盖
通过情况:unAC
关键词:树形dp 树的最小路径覆盖
思路:看数据范围我好像能建二分图跑啊,,,然而是sb做法,考虑直接dp
f[i][0/1]表示以i为根的子树,0表示i由某个子节点连接,1表示i由两个子节点连接也就是说形成一个“顶”,于是分情况转移就好,注意这里需要转移小优化加速转移
总结:研究树的各种与联系——二分图种种相
注意情况:无
15.题目名称:1924: [Sdoi2010]所驼门王的宝藏
通过情况:unAC
关键词:树形dp tarjan DAG
思路:考虑可以暴力建图,缩点形成DAG之后dp最长权值路,然后保准TLE,于是我的做法是拆点,将每个点拆为3个,分别代表横向,纵向,正常点,然后横向和纵向点分别向正常点连,然后横向的向相邻的点各连一条,这样边的个数就在O(n)了,可以愉快dp啦
总结:暴力建图往往走不通,需要将边的信息转化为点,这一点在很多题目中都有所体现(APIO2015 t2,没有名字的题目dp),应研究体会。
注意情况:无
16.题目名称:2067: [Poi2004]SZN
通过情况:unAC
关键词:树形dp 二分答案
思路:第一问同bzoj1907,第二问可以考虑二分答案+验证,这里注意到转移要合法,即在满足个数 + 二分限制的情况下长度尽量小,看能否完成,题目不是很难,也许是我想错了?!但写起来会很麻烦?
总结:有一类题目,你只需要做一遍简单情况记录整体信息,然后再做一遍复杂情况(根据第一遍得到的大量信息)会比较容易吧,模拟+重构技术,要仔细体会+做题学习
注意情况:无
17.题目名称:4027: [HEOI2015]兔子与樱花
通过情况:unAC
关键词:贪心
思路:数据范围让我们无法dp,那就贪心吧(是谁分到这个组里的!!!),很明显的一个贪心,dfs一遍,暴力合并,从叶节点开始,每个点都有一个对父节点的贡献值 = 樱花数 + 本身承载节点数 - 1,贡献值从小到大能删就删,然后将信息合并到父节点哪里,可以证明,若该节点不可删除,已达到最大值,那么它所有父节点都不可删除,可以贪心出解
复杂度:O(nlogn)(显然是个很松的上界,因为一旦不能合并父节点也就停止了)
总结:学习贪心,拟阵相关,贪心是门比dp还诡异的艺术
注意情况:无
18.题目名称:4013: [HNOI2015]实验比较
通过情况:unAC
关键词:树形dp(!!!)
思路:
注意情况:
19.题目名称:3829: [Poi2014]FarmCraft
通过情况:unAC
关键词:树形dp 贪心(调整法)
思路:可以看出,题目要求是dfs遍历一遍,然而遍历子树的顺序影响答案,考虑树形dp,f[i]表示从点出发,回到点i的答案,考虑经过点i直接安装就行,考虑遍历子树的顺序使ans最小,考虑从一颗子树走回来的时间,是time[son] = 2*size[son],走完子树并回到i的时间,应该max(f[son] + 1,time[son] + 2),这样所有儿子形成了一个二元组(ai,bi)那么一个排列对每个点的时间timei = sum(1 - (i - 1)](ai) + bi,根据计算,即贪心的调整法可知按a - b的的大小排序会试最大值最小,按此规律计算就好啦!
总结:树形dp不止dp,和很多知识相关联,儿子的合并处理尤其重要,一旦看明白实质,转化为noip难度的问题,一切都会显得简单,要“透过表象看实质”,把基础打好,基础很重要!!!
注意情况:无
20.题目名称:3611: [Heoi2014]大工程
通过情况:unAC
关键词:虚树 树形dp dfs序
思路:看见数据范围的西格玛一眼虚树了吧。建立虚树后就是三个简单的树形dp了吧比较简单,注意虚树上的点并不都是关键点,有一些是无效的lca,dp的时候不要搞错了。(一个无用的小性质:虚树的叶子节点全部是关键点)
总结:虚树(类似思想,有效点)相关(uoj某比赛题?)
注意情况:无
21.题目名称:3566: [SHOI2014]概率充电器
通过情况:unAC(!!!)
关键词:树形dp 概率和期望
思路:wait一下
注意情况:无
22.题目名称:3522: [Poi2014]Hotel
通过情况:unAC
关键词:树形dp 数学(抽象式子)
思路:dzy的题,都是数学题?这不是一道很难的题,关键在于如何合并子节点。考虑深度最深的有两个妹子,a,b,lca = LCA(a,b),考虑第三个妹子的位置,分情况讨论,第一,子树内,那肯定不能在两个妹子的路径上,也不能在妹子子树的其他位置,那样会导致矛盾(即取得是最深的两个),于是可以愉快的在其他子树内,于是导出三个深度相等 第二:在父节点以上部分,那么同样可以到处到i的距离相等,那么很愉快我们可以dp了(以上扯了这么一坨就是想严谨的告诉你满足题目条件的三个点是由某个点向外延伸相等长度的一个叉),f[i][j] 表示以i为根的子树向下长度为j的路径有多少条,g[i][j]表示向上有多少,dp出来,考虑点i的贡献,枚举长度,得出一个数列,我们要求的是形如abc + abd + bcd之类的数,暴力枚举三次方,于是考虑这样的可以变形(见ab + bc + ac = ((a + b + c)^2 - a^2 - b^2 - c^2)、2,加速计算,同样的类似(a + b + c)^3 = 3a^2*s + 3b^2*s + 3c^2 * s + 6abc,计算就好,可以推广到更多变量,假设有变量x1-xn,
s^3 = 3*ans + 3*s(x1^2 + x2^2 + ,,,) 感觉计算量不小啊。难道需要一些特殊的技巧?这道题没给取模是什么鬼,难道要我高精度?答案范围在哪里,被bzoj吃了吗!
总结:注意积累和思考,联系简单的情形,很多时候可以将某些抽象的答案写成数学形式,然后就可以很好地解决了。(思考本问题的更多相关拓展)
注意情况:无
23.题目名称:3162: 独钓寒江雪
通过情况:unAC)!!!)
关键词:
思路:
注意情况:
24.题目名称:3124: [Sdoi2013]直径
通过情况:unAC(!!!)
关键词:树形dp
思路:这道题做法层出不穷,原因是题目质量呵呵了,,怎么树形dp都可以,容我翻翻以前的题解回忆一下?
总结:加深对于常见事物的思考
注意情况:无
25.题目名称:3037: 创世纪(终结者?!)
通过情况:unAC
关键词:树形dp 基环 + 外向树
思路:同“1040: [ZJOI2008]骑士”几乎相同,定义f[i][0/1],然后拆环,枚举考虑是否拆开的边影响,树形dp就好,需要某些树形dp常用的小技巧加速转移。
总结:做了这么多题只会做自己会做的题的一样的题,弱到一定境界了吧,,
注意情况:无
26.题目名称:3206: [Apio2013]道路费用
通过情况:unAC(!!!)
关键词:无
思路:我很确定这是一道比较难的题而我一点也不会,是不是太弱了?
注意情况:无
27.题目名称:2878: [Noi2012]迷失游乐园
通过情况:unAC
关键词:树形dp 环 概率与期望
思路:第一道树形概率题,感觉有点蛋疼,感觉比起上面那道我不太会的概率充电器这道国赛题更良心?考虑到题目的要求是走到叶节点的长度,考虑dp,第一类:向下走,f[i]表示子树i向下的期望长度,转移比较简单f[i] = 1/degree(i) * sum(f[son] + 1,,,),考虑向上走,g[i] = 1/degree(i) * (g[fa] + 1 + f[fa的其他子树]) ,对于从每个点出发的答案是f[i] + g[i] ,总的要乘以1/n,f数组从下到上,g数组从上到下,推一遍就好,注意计算顺序和精度误差。(表示成分数形式?)
总结:1.树形dp基本套路,从上到下,从下倒上 2.学习概率和期望相关(包括结合树形dp和环状dp) 3.考虑如何避免精度误差(方法等)误差分析?
注意情况:无
28.题目名称:2657: [Zjoi2012]旅游(journey)
通过情况:unAC(!!!)
关键词:
思路:我!说!实话!zjoi的题目!都根本!读不懂啥意思啊!
注意情况:
29.题目名称:2500: 幸福的道路
通过情况:unAC(!!!)
关键词:
思路:读不懂好吧,,,
注意情况:
30.题目名称:2435: [Noi2011]道路修建
通过情况:unAC
关键词:树形dp
思路:国赛的题是要上天吗?是我读错题了吗,如果我没读错,那直接dp算就好了,好了,这个问题没啥价值,提出一个新问题:给出树/图,选出来(顺序有影响)最小化答案,?(!!!)思考,很有意思
总结: 无
注意情况:无
31.题目名称:2314: 士兵的放置
通过情况:unAC
关键词:树形dp 二分图的最小点覆盖
思路:题目等价于求树的最小点覆盖以及方案数,直接dp,f[i][0/1]表示i为根的子树答案(选i或者不选i),然后分情况转移(需要优化小技巧),然后计算方案数,g[i][0/1],在实行优化小技巧时有损失值delta,考虑损失值最小的那些都能被选为控制i的,那么考虑delta相同的子节点,它们的贡献是
(g[son][0] + g[son][1])*,,, - 1,然后剩下的根据最值只有一中选项,根据这一点dp就好
总结:树形dp转移的时候有诸多小技巧(差值计算,前后缀最值)
注意情况:无
32.题目名称:2152: 聪聪可可
通过情况:unAC
关键词:树形dp 余数分类
思路:考虑直接按余数0,1,2分类,dp的时候分类讨论,考虑两两,考虑贡献用式子维护就好,比较麻烦?
复杂度:O(n)
总结:无
注意情况:无
33.题目名称:2097: [Usaco2010 Dec]Exercise 奶牛健美操
通过情况:unAC(!!!)
关键词:
思路:
注意情况:
34.题目名称:2500: 幸福的道路
通过情况:unAC(!!!)
关键词:
思路:
注意情况:
未完待续,,,,,