概述
题目链接
题目思路
感觉这种题目对于我来说完全没思路。。。。哭了
要想让左子树点数-右子树点数的绝对值最大 ,我们可以把左子树尽量塞满,右子树用尽量少的节点。
左子树高度n-1,塞满的节点数为2^(n-1)-1
右子树高度要尽量小,为n-1-d,然后对于右子树的每个子树,把子树的左子树高度拉满点数尽量小树,右子树的高度尽量小,这个过程显然是个递归的过程,即设f[i]为高度为i的“平衡”树的最小的点数,显然f[i] = 1+f[i-1]+f[i-d-1]。
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define debug printf("I am heren");
using namespace std;
typedef long long ll;
const int maxn=1e6+5,inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n,d;
ll dp[maxn];
int main(){
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++){
dp[i]=dp[i-1]+dp[max(i-1-d,0)]+1;
}
ll ans=(1ll<<(n-1))-1-dp[max(n-1-d,0)];
printf("%lld",ans);
return 0;
}
最后
以上就是义气奇异果为你收集整理的牛客每日一题 平衡二叉树 题解(dp)的全部内容,希望文章能够帮你解决牛客每日一题 平衡二叉树 题解(dp)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复