动态规划-树形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为根的子树是否有黑色的点.这样从v和到u的时候就能够决定是否是要不要切断这条边

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值