本蒟蒻又卡题了!!

我可以给你大概画一个示意图,你需要吗

7 个赞

人才

5 个赞

看不懂

3 个赞

行,谢大佬

4 个赞

我本来,是想用暴力,样例能过,但是0分

4 个赞

额原题是这个 P2986 [USACO10MAR] Great Cow Gathering G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn),我的锅。

8 个赞

没事儿

4 个赞

你没发现你提交错了吗
我说的是第二题

5 个赞

啊对啊

4 个赞

现在第二题对了吗

5 个赞

A了

4 个赞

我的

4 个赞

第一题怎么样了

5 个赞

努力

4 个赞

可以看一下这里

5 个赞

7 个赞

嗯,谢大佬

4 个赞
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 105;
vector<int> adj[MAXN];
int w[MAXN]; 
int dp[MAXN][MAXN]; 
void dfs(int u, int parent) {
    dp[u][1] = w[u];
    for (int v : adj[u]) {
        if (v == parent) continue; 

        dfs(v, u);

        for (int j = MAXN - 1; j >= 1; --j) {
            if (dp[u][j] != -1) {
                for (int k = 1; k <= MAXN - 1; ++k) {
                    if (dp[v][k] != -1) {
                        int new_dist = dp[u][j] + dp[v][k] + k * j;
                        dp[u][j + k] = (dp[u][j + k] == -1) ? new_dist : min(dp[u][j + k], new_dist);
                    }
                }
            }
        }
    }
}

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> w[i];
    }
    for (int i = 1; i <= n; ++i) {
        adj[i].clear();
    }
    for (int i = 1; i <= n - 1; ++i) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    memset(dp, -1, sizeof(dp));
    dfs(1, -1);
    int min_dist = INT_MAX;
    for (int i = 1; i <= n; ++i) {
        if (dp[i][1] != -1) {
            min_dist = min(min_dist, dp[i][1]);
        }
    }

    cout << min_dist << endl;

    return 0;
}

0分

4 个赞

?你看懂我发的图了吗

7 个赞

你这是啥?

3 个赞