80 pts 求调
查看原帖
80 pts 求调
416242
New_hope楼主2023/10/14 22:01
#include<bits/stdc++.h>
#define int long long
#define _ (int)(2e3 + 4)
using namespace std;

int n,k,id;
int head[_],siz[_],f[_][_]; 
struct ed {
    int to,w,ne;
} a[_ << 1];

void add(int u,int v,int w) {
    a[++id] = {v,w,head[u]};
    head[u] = id;
}
// void outp(int x) {printf("%lld ",x);}
void dp(int u,int pre) {
    siz[u] = 1;
    for(int i = head[u]; i; i = a[i].ne) {
        int v = a[i].to;
        if(v == pre) continue;
        dp(v,u);
        siz[u] += siz[v];
    }
    for(int i = head[u]; i; i = a[i].ne) {
        int v = a[i].to, c = a[i].w;
        if(v == pre) continue;
        for(int j = min(siz[u],k); j >= 0; j --) { // 枚举u状态
            for(int p = 0; p <= min(j,siz[v]); p ++) { // 枚举v决策
                int tp = p*(k - p)*c + (siz[v] - p)*(n + p - k - siz[v])*c;
                f[u][j] = max(f[u][j],f[v][p] + f[u][j - p] + tp);
                // outp(tp);
            }
        }
    }
}
signed main() {

    scanf("%lld %lld",&n,&k);
    for(int i = 2; i <= n; i ++) {
        int a,b,c;
        scanf("%lld %lld %lld",&a,&b,&c);
        add(a,b,c), add(b,a,c);
    }
    dp(1,1);
    printf("%lld",f[1][k]);
    return 0;
}
/* f[u][j] : 给 u 的子树里分配 j 个黑点的最优值 
   v 为 u 的孩子节点
   f[u][j] = max(f[u][j], f[v][p] + f[u][j - p] + 
                          p * (k - p) * w(u,v) + (sizv - p) * (n + p - k - sizv) * w(u,v) );
*/
2023/10/14 22:01
加载中...