社区讨论
求助月赛 T2
学术版参与者 6已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @lo7wpwck
- 此快照首次捕获于
- 2023/10/27 09:00 2 年前
- 此快照最后确认于
- 2023/10/27 09:00 2 年前
思路是树形 dp 套 dp,但是 WA 一片
代码:
CPP#include <bits/stdc++.h>
using namespace std;
int a[5010], cnt[5010];
long long dp1[5010], dp2[5010];
vector<int> v[5010];
void dfs(int u, int fa)
{
for (int i = 0; i < v[u].size(); i++) if (v[u][i] != fa)
{
dfs(v[u][i], u);
cnt[u] += cnt[v[u][i]] + 1;
}
for (int i = 1; i <= cnt[u]; i++) dp2[i] = 1e18;
dp2[0] = 0;
for (int i = 0; i < v[u].size(); i++) if (v[u][i] != fa) for (int j = cnt[u]; j >= cnt[v[u][i]]; j--) dp2[j] = min(dp2[j], dp2[j - cnt[v[u][i]]] + dp1[v[u][i]]);
dp1[u] = 1e18;
for (int i = 0; i <= cnt[u]; i++) dp1[u] = min(dp1[u], dp2[i] + a[cnt[u] - i]);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 1; i < n; i++) cin >> a[i];
for (int i = 1; i < n; i++)
{
int x, y;
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1, 0);
cout << dp1[1] << endl;
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...