这题的第一想法就是我们对根节点进行贪心构造,使得左子树和右子树的差最大,这是最优的
左子树自然是以n-1为高度的满二叉树,这样节点最多,那么右子树我们需要考虑如何满足高度的平衡限制
我们发现为了对每个点都满足左右子树差值为d,我们相当于对于每个节点,左子树是一个高度为i-1的最少节点的树,而右子树是一个高度为i-1-d的最少节点的树
那么这样就看出了dp的方程式,只要从小往大递推即可
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const int N=1e5+10; const int mod=1e9+7; ll f[100]; int main(){ ios::sync_with_stdio(false); ll n,d; cin>>n>>d; int i; for(i=1;i<=n;i++){ f[i]=f[i-1]+f[max(0ll,i-1-d)]+1; } cout<<((1ll<<(n-1))-1-f[max(n-1-d,0ll)])<<endl; return 0; }