E73 树形DP P3177 [HAOI2015] 树上染色
视频链接:E73 树形DP P3177 [HAOI2015] 树上染色_哔哩哔哩_bilibili
P3177 [HAOI2015] 树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
// 树形DP O(n^2) #include <iostream> #include <cstring> #include <algorithm> #define LL long long using namespace std; const int N=2005; int idx,head[N]; struct E{int v,ne;LL w;}e[N<<1]; void add(int u,int v,int w){ e[++idx]={v,head[u],w};head[u]=idx; } int n,m,siz[N]; LL f[N][N],t; void dfs(int u,int fa){ siz[u]=1; for(int i=head[u];i;i=e[i].ne){ int v=e[i].v; LL w=e[i].w; if(v==fa) continue; dfs(v,u); for(int j=min(siz[u],m);j>=0;--j) for(int k=min(siz[v],m);k>=0;--k) if(j+k<=m){ t=k*(m-k)*w+(siz[v]-k)*(n-siz[v]-m+k)*w; f[u][j+k]=max(f[u][j+k],f[u][j]+f[v][k]+t); } siz[u]+=siz[v]; } } int main(){ scanf("%d%d",&n,&m); for(int i=1,u,v,w;i<n;++i){ scanf("%d%d%d",&u,&v,&w); add(u,v,w), add(v,u,w); } dfs(1,0); printf("%lld\n",f[1][m]); }