二叉苹果树[树型DP]

题目

https://jzoj.net/junior/#main/show/1661

小结

树形dp,和普通dp没什么区别,只是在树上做而已。
首先这题,我们设f[i,j]表示更新到第i个点时,下面取j条边。然后就可以乱搞啦~~
每次枚举当前的条数和子节点的条数,记得倒过来更新,这样才可以累加。很像背包有木有~~
所以f[i,j]=max(f[i,j],f[x,j-l]+f[y,l-1]+len[i,y]);//y是子节点。
就过啦~~~

var
        n,q,i,j,tot,x,y,z:longint;
        f,a:array[0..1000,0..1000]of longint;
        g:array[0..1000]of longint;
        tov,last,next:array[0..1000]of longint;
        bz:array[0..1000]of boolean;
procedure insert(x,y,z:longint);
begin
        inc(tot);
        tov[tot]:=y;
        a[x,y]:=z;
        next[tot]:=last[x];
        last[x]:=tot;
end;
function min(a,b:longint):longint;
begin
        if a>b then exit(b);
        exit(a);
end;
function max(a,b:longint):longint;
begin
        if a<b then exit(b);
        exit(a);
end;
procedure dg(x:longint);
var
        i,j,y,k,l:longint;
begin
        bz[x]:=true;
        i:=last[x];
        while i<>0 do
        begin
                y:=tov[i];
                if bz[y]=false then
                begin
                        dg(y);
                        g[x]:=g[x]+g[y]+1;
                        for j:=min(g[x],q) downto 1 do//当前的状态
                                for l:=min(g[x],j) downto 1 do//上次的状态
                                        f[x,j]:=max(f[x,j],f[x,j-l]+f[y,l-1]+a[x,y]);
                end;
                i:=next[i];
        end;
end;
begin
        readln(n,q);
        for i:=1 to n-1 do
        begin
                readln(x,y,z);
                insert(x,y,z);
                insert(y,x,z);
        end;
        dg(1);
        writeln(f[1,q]);
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉排序树(BST)是一种具有动态性的树型查找结构,也被称为二叉查找树或二叉搜索树。它的特点是左子树上所有节点的键值小于根节点的键值,右子树上所有节点的键值大于根节点的键值。对于一个集合按二叉排序树进行查找时,可以对排序树进行一些必要的优化,如加权平衡树(WBT)、AVL树(平衡二叉树)、红黑树、Treap(Tree Heap)等。 关于二叉排序树的建立,可以按照以下步骤进行: 1. 创建一个空的二叉排序树。 2. 从集合中选择一个节点作为根节点,将其插入到二叉排序树中。 3. 对于集合中的每个节点,按照二叉排序树的性质将其插入到相应的位置。 4. 重复步骤3,直到集合中的所有节点都被插入到二叉排序树中。 二叉排序树的建立过程可以通过递归或者非递归的方式实现。递归方式的建立可以按照以下步骤进行: 1. 如果二叉排序树为空,则将当前节点作为根节点。 2. 如果当前节点的键值小于根节点的键值,则继续在左子树中插入当前节点。 3. 如果当前节点的键值大于根节点的键值,则继续在右子树中插入当前节点。 非递归方式的建立可以按照以下步骤进行: 1. 如果二叉排序树为空,则将当前节点作为根节点。 2. 从根节点开始,逐级比较当前节点的键值和每个节点的键值,直到找到一个合适的位置插入当前节点。 3. 如果当前节点的键值小于目标节点的键值,则将当前节点放在目标节点的左子树中。 4. 如果当前节点的键值大于目标节点的键值,则将当前节点放在目标节点的右子树中。 希望以上内容对您有所帮助!如果您还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值