zoukankan      html  css  js  c++  java
  • 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
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    医院产品演变畅想
    2014-1-19
    更新一下blog
    tostring的自动调用
    解决evernote更新报错问题
    健身日记
    跑步计划
    [转载]offsetHeight , clientHeight, scrollHeight 区别
    做一个院友网站杂记
    查好友摇一摇功能的感受
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/14408847.html
Copyright © 2011-2022 走看看