放一部分代码
int n, L[N], R[N], a[N], b[N], c[N], dep[N], sz[N];
long long dp[N][40][40];
void dfs(int u, int depth, int fa) {
if (u == 0) return;
if (u >= n) {
for (int i = 0; i <= depth; i++) {
for (int j = 0; j <= depth; j++) {
if (i + j <= depth) {
dp[u][i][j] = 1ll * c[u] * (1ll * a[u] + i) * (b[u] + j);
}
}
}
return;
}
dfs(L[u], depth + 1, u); dfs(R[u], depth + 1, u);
for (int i = 0; i <= depth; i++) {
for (int j = 0; j <= depth; j++) {
if (i + j <= depth) {dp[u][i][j] = 1e18;
dp[u][i][j] = min(dp[u][i][j], dp[L[u]][i + 1][j] + dp[R[u]][i][j]);
dp[u][i][j] = min(dp[u][i][j], dp[L[u]][i][j] + dp[R[u]][i][j + 1]);
}
}
}
}