树形DP
x_1023
这个作者很懒,什么都没留下…
展开
-
BZOJ 2152 聪明可可 - 点分治/树形DP
点分治的话好像是很裸的一种,总结一下点分治的两种做法: 1.利用大树和子树之间的关系计算并容斥; 2.在父亲节点上直接利用处理虚树的办法合并子树。 这道题网上的第一种做法貌似很普遍,其实第二种更好些一些,大概就是计算一下经过分治点的边数满足题意的有多少个,注意节点本身还有一个长度0的路径。 #include #include #include #include #include原创 2017-09-06 20:50:50 · 185 阅读 · 0 评论 -
POJ 1155 TELE - 树形DP
一道类似于背包的题,一眼便能看出是树形DP 树形DP大概的思想大概就是虚树思想:先选定一个子节点,然后以此节点作为左儿子和右边一个儿子合并共同记为左儿子,其他右儿子一个个向左合并。 dp[i][j]意为编号为i的节点的所有子树共同选定j个用户所获得的利润,利润为负则是亏本。 一开始肯定都要赋-INF 的初值 DP方程很好写啊: for(int j=m;j>=0;j--)//枚举根节点能取原创 2017-09-24 11:02:02 · 229 阅读 · 0 评论 -
POJ 2486 Apple Tree - 树形DP
本来想的是三维,0表示不返回,1表示返回,2表示返回+不返回 后来转念一想2状态不是完全浪费了吗,和0完全等同 想成一个自动机,大概就是0是结束态,1是接受态(对应上面两种不返回/返回状态),1+1->1,1+0->0 有两种情况 1+1>1 1+0->0 这里还需要注意一下由于两个子树并无顺序的先后,因此还需继续讨论先后次序问题(三个讨论的具体内容见代码) 其次就是子树通过根节点联系,所以原创 2017-09-28 00:00:54 · 188 阅读 · 0 评论 -
POJ 1947 Rebuilding Roads - 树形DP
还是那句话。。。DP真恶心。。。这道题大概就是添加子树时由于子树和根节点有边相连,于是每一种情况都要+1,然后再取minDP方程真的很好写啊。。。就是边界和循环太恶心了 注意就是dp[x][0]是没有任何意义的,因为至少根节点会被选取,所以下限个数为1。然后就是需要注意若当前根节点不为整体棵树的root,则必须断掉来路,ans+1。#include<iostream> #include<cstri原创 2017-09-29 23:34:59 · 165 阅读 · 0 评论 -
BZOJ 1912 [Apio2010]patrol 巡逻 - 树形DP(树的直径)
一眼看出了是求树的直径,然而没学过可怎么破。。。然后百度自学了一波 http://www.cnblogs.com/wuyiqi/archive/2012/04/08/2437424.html大概方法就是任找一个点,找离他最远的点,此点必为直径的端点,然后以此为基准再找一个离他最远的点,连成的链即树的直径。(证明见上地址)k=0,观察到每条边必走两遍,无关于出发点k=1即一个裸的树的直径,原因是图中原创 2017-10-27 00:58:28 · 213 阅读 · 0 评论 -
BZOJ 1907 树的路径覆盖 - 树形DP/贪心
树形DP的做法显然: 对于任意一个节点,它可以连接两个节点,那么设0状态为不能再连接节点,1为还可以再连接一个节点,伸出一条手臂可以再搭上别的节点。 0/1状态初值均设为1。 那么合并子树的过程中有如下的转移方式:1.父节点和子树相连,则两个状态必须都为1,由于连接即为路径的延长,相当于取消子节点那一条连接着的路径的独立性,合并到父节点路径上,则可以消除那一条子节点路径的代价。 2.父节点不原创 2017-10-15 17:51:58 · 280 阅读 · 1 评论