动态规划-树形dp总结

一.简单的从下到上和从上到下的统计

1.      dp[u]表示以u为根的一共有多少个节点.可以用来求重心.

2.      每个点出发能够走得最远的长度.dpm[u], dps[u]用来保存u为根到子树的最长距离,注意两者区别是不同的儿子(不想交路径).另外有一个f[u]指的是去掉u的儿子们之后,u可以发出的最长链.这样的是一个规范的从上往下的dp.我是这样定的:定状态f[u]要求不能考虑u的儿子,具体考虑不考虑u看题意.比如这个就要看u.那么我们的主要过程是已知u去推v.那么遍历u的儿子v,穿进去v的答案应该是1+非v的最长子树链和1+u的答案.

3.  把一棵树变成环.其实就是把一棵树先变成一个链,然后再加一条边变成环.而且变成环也好变.考虑u和v们,v首先需要变成链,但是每条链都有两个机会不用拆,并且要求v在v的链中也是链段.这样的话dp二维01,0带便随意,1代表强制根节点是一个链段.之后横着dp.

flag = 1;

            f_2 = min(f_2 + dp[v][0] + 2, f_1+dp[v][1]);//v是不是一个//链端

            if(f_2 > INF)

                f_2 = INF;

            f_1 = min(f_1 + dp[v][0] + 2, dp[v][1]+cnt*2+sum);//v//不是一个链端

            cnt++;

            sum += dp[v][0];

 

多开一维来描述根的某种状态的方法很常用.本题是是否为链的一端.

(2)还有一题:不能选的点之间有相连的地方.开一维定义是否选根了.

(3)另外cf也有一道题,要求一颗子树上有且仅有一个黑色的点.那么多开一维来看这个u为根的子树是否有黑色的点.这样从<

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值