bzoj4033-树形dp

Posted moxingtianxia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj4033-树形dp相关的知识,希望对你有一定的参考价值。

技术图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<string>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<iomanip>
 8 using namespace std;
 9 //f[i][t]表示以i为根,子树有t个点染黑的收益
10 //考虑对每一条边计算贡献:有几个点的路径上也包含这条边。
11 //f[x][j+t]=max(f[x][j+t],f[x][j]+f[y][t]+(long long)edge[i].dis*(t*(k-t)+(size[y]-t)*(n-k-(size[y]-t))));
12 //最后更新size[x] 
13 namespace Moxing
14     const int N=2005;
15     int n,k,last[N],cnt,size[N],son[N<<1];
16     long long f[N][N];
17     struct node
18         int to,dis,nxt;
19     edge[N<<1];
20     void add(int from,int to,int dis)
21         edge[++cnt].to=to,edge[cnt].dis=dis,edge[cnt].nxt=last[from],last[from]=cnt;
22     
23     void dfs(int x,int fa)
24     //    f[x][0]=f[x][1]=0;
25         size[x]=1;
26         for(int i=last[x];i;i=edge[i].nxt)
27             int y=edge[i].to;
28             if(y==fa) continue ;
29             dfs(y,x);
30             for(int j=min(k,size[x]);j>=0;j--)
31                 for(int t=min(k-j,size[y]);t>=0&&(j+t)<=k;t--)// j+t<=k -> t<=k-j
32                     f[x][j+t]=max(f[x][j+t],f[x][j]+f[y][t]+(long long)edge[i].dis*(t*(k-t)+(size[y]-t)*(n-k-(size[y]-t))));
33                 
34             
35             size[x]+=size[y];
36         
37      
38     struct maina
39         main()
40             scanf("%d%d",&n,&k);
41             for(int i=1;i<=n-1;i++)
42                 int from,to,dis;
43                 scanf("%d%d%d",&from,&to,&dis);
44                 add(from,to,dis),add(to,from,dis);
45             
46             dfs(1,1);
47             printf("%lld\n",f[1][k]);
48             exit(0);
49         
50     UniversalLove;
51  
52 int main()
53     Moxing::main();
54 
View Code

 

以上是关于bzoj4033-树形dp的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4033: [HAOI2015]树上染色(树形dp)

BZOJ4033[HAOI2015]树上染色 树形DP

BZOJ4033 [HAOI2015]树上染色 树形dp

BZOJ 4753 二分+树形DP

BZOJ 4033: [HAOI2015]树上染色

BZOJ 4033: [HAOI2015]树上染色