NC19775 平衡二叉树(记忆化搜索 || dp)

题目链接

题意:
建 一 棵 高 度 为 n , 并 且 每 个 结 点 的 左 右 子 树 高 度 差 不 超 过 d 的 平 衡 二 叉 树 建一棵高度为n,并且每个结点的左右子树高度差不超过d的平衡二叉树 nd
在 这 基 础 上 , 问 这 个 平 衡 树 的 左 右 子 树 的 结 点 个 数 差 最 多 为 多 少 在这基础上,问这个平衡树的左右子树的结点个数差最多为多少
题解:
n , d < = 60 n,d<=60 n,d<=60
想 要 结 点 个 数 差 最 大 , 肯 定 是 一 棵 子 树 结 点 个 数 最 少 , 另 外 一 个 最 大 想要结点个数差最大,肯定是一棵子树结点个数最少,另外一个最大
并 且 要 让 最 大 的 子 树 的 高 度 比 另 一 棵 多 d 并且要让最大的子树的高度比另一棵多d d
最 大 直 接 造 一 棵 高 度 为 n 的 满 二 叉 树 , 2 n − 1 − 1 最大直接造一棵高度为n的满二叉树,2^{n-1}-1 n2n11
另 一 棵 肯 定 尽 量 造 一 个 结 点 比 较 少 的 平 衡 二 叉 树 另一棵肯定尽量造一个结点比较少的平衡二叉树

考 虑 造 结 点 少 的 平 衡 二 叉 树 , 高 度 首 先 为 n − d − 1 考虑造结点少的平衡二叉树,高度首先为n-d-1 nd1
假 设 当 前 树 高 为 h , 想 要 恰 好 满 足 题 目 要 求 并 且 最 少 假设当前树高为h,想要恰好满足题目要求并且最少 h
那 就 是 建 一 棵 高 度 为 h − 1 的 子 树 , 和 一 棵 h − d − 1 的 子 树 那就是建一棵高度为h-1的子树,和一棵h-d-1的子树 h1hd1
可 以 通 过 记 忆 化 搜 索 进 行 计 算 可以通过记忆化搜索进行计算
边 界 条 件 边界条件
1. h < = 0 的 时 候 返 回 0 1.h<=0的时候返回0 1.h<=00
2. h = = 1 的 时 候 返 回 1 2.h==1的时候返回1 2.h==11
其 余 的 返 回 建 左 树 + 建 右 树 + 1 的 个 数 即 可 其余的返回建左树+建右树+1的个数即可 ++1

也 可 以 用 d p 计 算 , 思 想 类 似 也可以用dp计算,思想类似 dp
d p [ i ] 表 示 高 度 为 i 时 恰 好 建 成 一 个 题 目 要 求 的 平 衡 二 叉 树 的 结 点 个 数 dp[i]表示高度为i时恰好建成一个题目要求的平衡二叉树的结点个数 dp[i]i
转 移 方 程 为 d p [ i ] = d p [ i − 1 ] + d p [ i − d − 1 ] + 1 转移方程为dp[i]=dp[i-1]+dp[i-d-1]+1 dp[i]=dp[i1]+dp[id1]+1
就 是 建 一 棵 高 度 i − 1 的 子 树 和 i − d − 1 的 子 树 并 加 根 就是建一棵高度i-1的子树和i-d-1的子树并加根 i1id1

最 后 用 最 大 的 减 后 来 计 算 的 高 度 为 n − d − 1 的 个 数 最后用最大的减后来计算的高度为n-d-1的个数 nd1

AC代码
初学python,上一手拙劣代码

n, d = map(int,input().split())
f=[0 for i in range(140)]
f[1]=1
for i in range(2, n+1):
    f[i] = 1 + f[i - 1] + f[i - d - 1]
print((1 << n - 1) - 1 - f[n - d - 1])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值