蓝桥杯-最小权值

对于一棵有根二叉树 TT,小蓝定义这棵树中结点的权值 W(T)如下:

空子树的权值为 0。

如果一个结点 v 有左子树 L, 右子树 R,分别有 C(L) 和 C(R) 个结点,则

W(v)=1+2W(L)+3W(R)+(C(L))^{2}C(R)

树的权值定义为树的根结点的权值。

小蓝想知道,对于一棵有 2021 个结点的二叉树,树的权值最小可能是多少?

题解:

w(0) = 0;

w(1) = 1+2*w(0)+3*w(0)+0^2*0=1;

w(n) = Math.min(1+2*w(x)+3*w(n-x-1)+x^2*(n-x-1) ,1+2*w(n-x-1)+3*w(x)+x*(n-x-1)^2);

规律就是,将一棵树可以有左子树,右子树和根节点。

          root

left                 right

现在,可以循环调用左子树的数量,左子树可以为0-n-1(这里n为结点树,那么右结点的个树就可以得到)。在这里,左子树和右子树交换的结果不一样,所以都要枚举,然后计算其最小。然后通过迭代得到2021颗结点。

 public static void main(String[] args) {
        int n = 2021;
        long[] dp = new long[n+1];
        for(int j = 1;j<=n;j++){
            long min = Long.MAX_VALUE;
            for(int i=0;i<=j-1;i++){
                long tmp = Math.min(1L+2*dp[i]+3L*dp[j-1-i]+ (long) i *i*(j-1-i),1L+2L*dp[j-1-i]+3L*dp[i]+ (long) i *(j-1L-i)*(j-1L-i));
                min = Math.min(min,tmp);
            }
            dp[j] = min;
        }
        System.out.println(dp[2021]);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值