BZOJ 4033: [HAOI2015]树上染色
树形DP
复杂度为树上链的个数
即O(n^2)
#include<cstdio> #include<algorithm> using namespace std; int cnt,n,k,last[2005],sz[2005]; long long F[2005][2005]; struct node{ int to,next,val; }e[4005]; void add(int a,int b,int c){ e[++cnt].to=b; e[cnt].val=c; e[cnt].next=last[a]; last[a]=cnt; } void dfs(int x,int fa,int val){ sz[x]=1; for (int i=last[x]; i; i=e[i].next){ int V=e[i].to; if (V==fa) continue; dfs(V,x,e[i].val); for (int a=min(k,sz[x]); a>=0; a--) for (int b=min(k,sz[V]); b>=0; b--) F[x][a+b]=max(F[x][a+b],F[x][a]+F[V][b]); sz[x]+=sz[V]; } for (int i=0; i<=min(k,sz[x]); i++) F[x][i]+=1ll*val*(i*(k-i)+(sz[x]-i)*(n-k-(sz[x]-i))); } int main(){ scanf("%d%d",&n,&k); for (int i=1; i<n; i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } dfs(1,0,0); printf("%lld\n",F[1][k]); return 0; }