代码改变世界

树型动态规划(树形dp)

  youxin  阅读(1135)  评论(0编辑  收藏  举报

树型动态规划就是在“树”的数据结构上的动态规划,树型动态规划是建立在树上的,所以有二个方向: 1.根—>叶:这种题目基本上碰不到 2.叶->根:根的子节点传递有用的信息给根,完后根得出最优解的过程。这种的题目是树型动态规划的最常见类型。 首先定义

       无根树:题目中可以以任意节点为根建树,经过动态规划后即可直接得到最优值。
       有根树:必须以某一个节点为根建树才能通过动态规划后得到最优值。

基本上有这样一个步骤:

一、有根树:

      1.建树(一般以递归方式实现,有时数据过大以BFS方式实现)
      2.在建树中找到叶子的时候特别赋值。
      3.回溯时通过方程确定出每个节点的最优值并记录。
      4.遍历完整棵树后一般以根节点值作为最终值。

 

补充:关于建树,有很多时候会将原来的多叉树改造为左孩子右兄弟的二叉树,以下两道例题用到了这种改造。
例题1:Tyvj P1051 选课
例题2:Vijos P1518 河流(IOI2005 Rivers)

 

//简单的改造代码:
        for i:=1 to n do
            if ft[root[i]]=false then//这个节点目前还没有孩子
                begin
                  a[root[i]].left:=i;//把这玩意儿放到当前节点的左边
                    ft[root[i]]:=true;//标记-有孩子了
                    num[root[i]]:=i;//该节点当前最后一个孩子
                end
            else//有孩子了
                begin
                  a[num[root[i]]].right:=i;//把这玩意儿给他当前最后一个孩子的右边
                     num[root[i]]:=i;
              end;//By 澹台彦澍


二、无根树:

      1.随机定根,重复有根树过程
      2.要枚举节点作为根的情况重复有根树过程。
例题:Vijos P1100 加分二叉树(NOIp2003第三题)

 

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示