NC19775 平衡二叉树(贪心)

这题的第一想法就是我们对根节点进行贪心构造,使得左子树和右子树的差最大,这是最优的

左子树自然是以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;
}
View Code

 

posted @ 2021-02-17 14:45  朝暮不思  阅读(34)  评论(0编辑  收藏  举报