社区讨论

求助月赛 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 条回复,欢迎继续交流。

正在加载回复...