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