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;
}

浙公网安备 33010602011771号