zoukankan      html  css  js  c++  java
  • WannaflyCamp 平衡二叉树(DP)题解

    链接:https://www.nowcoder.com/acm/contest/202/F
    来源:牛客网

    题目描述

    平衡二叉树,顾名思义就是一棵“平衡”的二叉树。在这道题中,“平衡”的定义为,对于树中任意一个节点,都满足左右子树的高度差不超过 d. 空树的高度定义为0,单个节点的高度为1,其他情况下树的高度定义为根节点左右子树高度最大值 + 1. 一棵在高度上平衡的树,节点数可能不平衡,因此再定义一棵树的不平衡度为这棵树中所有节点的左右子树的节点数之差的最大值。
    给定平衡的定义参数d, 你需要求出所有高度为 n 的平衡树中不平衡度的最大值。

    输入描述:

    两个整数,n, d.

    输出描述:

    一个整数:所有高度为 n 的平衡树中不平衡度的最大值。
    示例1

    输入

    4 1

    输出

    5

    思路:显然选择根节点差最大。显然左树是满二叉树。那么要保证右树最小。我们用dp[i]表示深度为i的最小平衡树结点数,一棵树的左右子树深度差d,假如深度为n,那么左树是dp[n - 1],右树是dp[n - 1 - d]。

    代码:

    #include<set>
    #include<map>
    #include<stack>
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    typedef long long ll;
    const int maxn = 5000 + 10;
    const int seed = 131;
    const ll MOD = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    ll dp[100];
    int main(){
        ll n, d;
        scanf("%lld%lld", &n, &d);
        if(n == 0){
            printf("0
    ");
        }
        else{
            for(int i = 0; i <= d; i++) dp[i] = i;
            for(int i = d + 1; i <= n - 1 - d; i++){
                dp[i] = dp[i - 1] + dp[i - 1 - d] + 1;
            }
            ll l = (1LL << (n - 1)) - 1, r = dp[n - 1 - d];
            printf("%lld
    ", l - r);
        }
        return 0;
    }
  • 相关阅读:
    笔记75 微服务笔记2
    笔记73 高级SSM整合2
    笔记72 高级SSM整合
    笔记71 SSM整合
    笔记70 Spring Boot快速入门(八)(重要)
    笔记69 基于Redis的zSet集合做数据缓存实现分页查询
    如何理解多租户架构?
    Tomcat8.0源码编译
    HTML语言
    String类
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9737947.html
Copyright © 2011-2022 走看看