牛客國慶集訓day2——F——平衡二叉樹(DP)
阿新 • • 發佈:2018-12-13
最大不平衡度就是一邊為滿二叉樹,另一邊為最小平衡樹。如何求最小平衡樹的節點數呢?
對於每一個節點,都可以看做一個平衡樹的根節點,當左子樹為n時,右子樹只需要n-1-d就行
了。所以遍歷差量d和層數n,遞推方程就是a[i][j]=a[i][j-1]+a[i][max(0,j-i-1)]+1。程式碼:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> using namespace std; typedef long long ll; const int maxn=100; ll a[maxn][maxn]; int main() { ll n,d; while(scanf("%lld%lld",&n,&d)!=EOF) { if(d==0) { printf("0\n"); continue; } ll t=n-1; a[0][1]=1; for(int i=0;i<=d;i++)//差 { for(int j=1;j<=n;j++)//層 { a[i][j]=a[i][j-1]+a[i][max(0,j-1-i)]+1; } } ll ans=pow(2,t); printf("%lld\n",ans-1-a[d][max(0LL,n-1-d)]); } return 0; }