题意:
建
一
棵
高
度
为
n
,
并
且
每
个
结
点
的
左
右
子
树
高
度
差
不
超
过
d
的
平
衡
二
叉
树
建一棵高度为n,并且每个结点的左右子树高度差不超过d的平衡二叉树
建一棵高度为n,并且每个结点的左右子树高度差不超过d的平衡二叉树
在
这
基
础
上
,
问
这
个
平
衡
树
的
左
右
子
树
的
结
点
个
数
差
最
多
为
多
少
在这基础上,问这个平衡树的左右子树的结点个数差最多为多少
在这基础上,问这个平衡树的左右子树的结点个数差最多为多少
题解:
n
,
d
<
=
60
n,d<=60
n,d<=60
想
要
结
点
个
数
差
最
大
,
肯
定
是
一
棵
子
树
结
点
个
数
最
少
,
另
外
一
个
最
大
想要结点个数差最大,肯定是一棵子树结点个数最少,另外一个最大
想要结点个数差最大,肯定是一棵子树结点个数最少,另外一个最大
并
且
要
让
最
大
的
子
树
的
高
度
比
另
一
棵
多
d
并且要让最大的子树的高度比另一棵多d
并且要让最大的子树的高度比另一棵多d
最
大
直
接
造
一
棵
高
度
为
n
的
满
二
叉
树
,
2
n
−
1
−
1
最大直接造一棵高度为n的满二叉树,2^{n-1}-1
最大直接造一棵高度为n的满二叉树,2n−1−1
另
一
棵
肯
定
尽
量
造
一
个
结
点
比
较
少
的
平
衡
二
叉
树
另一棵肯定尽量造一个结点比较少的平衡二叉树
另一棵肯定尽量造一个结点比较少的平衡二叉树
考
虑
造
结
点
少
的
平
衡
二
叉
树
,
高
度
首
先
为
n
−
d
−
1
考虑造结点少的平衡二叉树,高度首先为n-d-1
考虑造结点少的平衡二叉树,高度首先为n−d−1
假
设
当
前
树
高
为
h
,
想
要
恰
好
满
足
题
目
要
求
并
且
最
少
假设当前树高为h,想要恰好满足题目要求并且最少
假设当前树高为h,想要恰好满足题目要求并且最少
那
就
是
建
一
棵
高
度
为
h
−
1
的
子
树
,
和
一
棵
h
−
d
−
1
的
子
树
那就是建一棵高度为h-1的子树,和一棵h-d-1的子树
那就是建一棵高度为h−1的子树,和一棵h−d−1的子树
可
以
通
过
记
忆
化
搜
索
进
行
计
算
可以通过记忆化搜索进行计算
可以通过记忆化搜索进行计算
边
界
条
件
边界条件
边界条件
1.
h
<
=
0
的
时
候
返
回
0
1.h<=0的时候返回0
1.h<=0的时候返回0
2.
h
=
=
1
的
时
候
返
回
1
2.h==1的时候返回1
2.h==1的时候返回1
其
余
的
返
回
建
左
树
+
建
右
树
+
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[i−1]+dp[i−d−1]+1
就
是
建
一
棵
高
度
i
−
1
的
子
树
和
i
−
d
−
1
的
子
树
并
加
根
就是建一棵高度i-1的子树和i-d-1的子树并加根
就是建一棵高度i−1的子树和i−d−1的子树并加根
最 后 用 最 大 的 减 后 来 计 算 的 高 度 为 n − d − 1 的 个 数 最后用最大的减后来计算的高度为n-d-1的个数 最后用最大的减后来计算的高度为n−d−1的个数
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])