代码实现
听说要卡空间?
总之
200
+
M
B
200+MB
200+MB水过
#include<cstdio>
#include<cstring>
const int MAXN = 2e4 + 10
long long f[MAXN][42][42];
int son[MAXN][3], a[2 * MAXN], b[2 * MAXN], c[2 * MAXN];
int N;
long long min(long long x, long long y){return x < y ? x : y;}
long long dfs(int k, int x, int y)
{
if (k >= N) return 1LL * c[k] * (a[k] + x) * (b[k] + y);
if (f[k][x][y] != f[0][0][0]) return f[k][x][y];
return f[k][x][y] = min(dfs(son[k][0], x, y) + dfs(son[k][1], x, y + 1),
dfs(son[k][0], x + 1, y) + dfs(son[k][1], x, y));
}
int main()
{
memset(f, 0x3f, sizeof(f));
scanf("%d", &N);
for (int i = 1; i < N; i++)
{
int x, y; scanf("%d%d",&x, &y);
if (x < 0) x = - x + N - 1;
if (y < 0) y = - y + N - 1;
son[i][0] = x, son[i][1] = y;
}
for (int i = N; i <= N + N - 1; i++) scanf("%d%d%d", &a[i], &b[i], &c[i]);
printf("%lld", dfs(1, 0, 0));
return 0;
}