对于一棵有根二叉树 TT,小蓝定义这棵树中结点的权值 W(T)如下:
空子树的权值为 0。
如果一个结点 v 有左子树 L, 右子树 R,分别有 C(L) 和 C(R) 个结点,则
树的权值定义为树的根结点的权值。
小蓝想知道,对于一棵有 2021 个结点的二叉树,树的权值最小可能是多少?
题解:
规律就是,将一棵树可以有左子树,右子树和根节点。
root
left right
现在,可以循环调用左子树的数量,左子树可以为0-n-1(这里n为结点树,那么右结点的个树就可以得到)。在这里,左子树和右子树交换的结果不一样,所以都要枚举,然后计算其最小。然后通过迭代得到2021颗结点。
public static void main(String[] args) {
int n = 2021;
long[] dp = new long[n+1];
for(int j = 1;j<=n;j++){
long min = Long.MAX_VALUE;
for(int i=0;i<=j-1;i++){
long tmp = Math.min(1L+2*dp[i]+3L*dp[j-1-i]+ (long) i *i*(j-1-i),1L+2L*dp[j-1-i]+3L*dp[i]+ (long) i *(j-1L-i)*(j-1L-i));
min = Math.min(min,tmp);
}
dp[j] = min;
}
System.out.println(dp[2021]);
}