关闭

【bzoj4033】 T1 树形dp

334人阅读 评论(0) 收藏 举报
分类:

    表示长这么大第一次写树形背包,感觉有些难理解。

    f[i][j]表示考虑以i为根这棵子树,有j个黑色结点的最大贡献值为多少。

    则每次转移的时候我们需要考虑每条边对答案作出的贡献,为((k-j)*j+(size[i]-j)*(n-k+j-size[i]))*w。

    利用那种类似树形背包的dp,O(n^2)解决。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 2010

using namespace std;

int n,m,k,num;
int head[maxn],to[2*maxn],next[2*maxn],v[2*maxn],size[maxn];
long long tmp[maxn];
long long f[maxn][maxn];

void addedge(int x,int y,int z)
{
	num++;to[num]=y;v[num]=z;next[num]=head[x];head[x]=num;
}

long long calc(int x,int y)
{
	return (long long)y*(x-y);
}

void dfs(int x,int fa,int w)
{
	size[x]=1;
	for (int p=head[x];p;p=next[p])
	  if (to[p]!=fa)
	  {
	  	dfs(to[p],x,v[p]);
	  	memcpy(tmp,f[x],sizeof(tmp));
	  	for (int i=0;i<=min(size[x],k);i++)
	  	  for (int j=0;j<=min(size[to[p]],k-i);j++)
	  	    tmp[i+j]=max(tmp[i+j],f[x][i]+f[to[p]][j]);
	  	memcpy(f[x],tmp,sizeof(tmp));
	  	size[x]+=size[to[p]];
	  }
	for (int i=0;i<=min(size[x],k);i++)
	  f[x][i]+=(calc(k,i)+calc(n-k,size[x]-i))*w;
}

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);
		addedge(x,y,z);
		addedge(y,x,z);
	}
	dfs(1,0,0);
	printf("%lld\n",f[1][k]);
	return 0;
}


0
0
查看评论

bzoj4033[HAOI2015] 树上染色

treedp
  • u010336344
  • u010336344
  • 2017-03-11 10:44
  • 737

[BZOJ4033][HAOI2015]T1(树形dp)

就算你将遗忘一切,我也会永远记得。
  • Clove_unique
  • Clove_unique
  • 2016-05-11 10:46
  • 2448

【HAOI2015】【bzoj4033】【T1】

4033: [HAOI2015]T1Time Limit: 10 Sec Memory Limit: 256 MB Submit: 226 Solved: 111 [Submit][Status][Discuss] Description有一棵点数为 N 的树,树边有边权。给你一个在 0~...
  • FZHvampire
  • FZHvampire
  • 2015-06-21 11:26
  • 1587

BZOJ 4033 HAOI2015 T1 树形DP

题目大意:给定一棵树,你需要把其中的kk个点染成黑色,使得黑色点两两之间的距离和+白色点两两之间的距离和最大,求最大值 题解戳这里 Orz ydcydc 看来我对于非线性的树形DP还是做得太少了QwQ#include <cstdio> #include <cstring>...
  • PoPoQQQ
  • PoPoQQQ
  • 2015-05-15 13:54
  • 2180

BZOJ 4033 树上染色 (题解)(树上动规)

最近我总是辗转反侧,难以入眠,对我们曾有过的愿景,浮想联翩。但亲爱的,我早已在内心深处祈祷着,祈祷自己不再迷失于金钱的追逐中。 想了好久终于明白错在哪里了,,, 题意如下: 有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-...
  • Kamisama123
  • Kamisama123
  • 2017-03-24 23:11
  • 390

bzoj4033 T1 树形dp

一道比较考思维的树形dp。        如果直接定义f[i][j]为i所在子树中取j个黑色的最大值的话是没办法转移的吧。。因此我们不妨考虑一条边带来的影响。如果令f[i][j]为i所在子树中取j个黑色时,i所在子树中边的影响总和最大的值,就很方便转移了。所谓...
  • lych_cys
  • lych_cys
  • 2016-03-14 15:59
  • 339

[BZOJ4033][HAOI2015]树上染色(思路+树形背包DP)

以下记sze[u]sze[u]为uu的子树大小,val(u,v)val(u,v)为边(u,v)(u,v)的权值。 看到20002000的数据范围,首先猜想到可能复杂度是O(n2)O(n^2)。 首先想到的DP方案是:f[u][i]f[u][i]为uu的子树内,将ii个点染成黑色,在子树内的最大收...
  • xyz32768
  • xyz32768
  • 2018-01-05 21:23
  • 49

BZOJ4033 [HAOI2015]树上染色

考虑dp f[i][j]表示以i为根的子树里有j个黑点,他们对答案的最大贡献是多少 这个贡献不仅考虑子树内同色的点两两之间的距离,也考虑子树内的点与子树外的点之间的距离和在子树内的部分 然后我们枚举x的每个儿子y,再在1~当前的siz[x]和1~当前的siz[y]中枚举分别放多少个黑点,更新d...
  • neither_nor
  • neither_nor
  • 2016-12-29 14:51
  • 427

bzoj 4033: [HAOI2015]树上染色 树形dp

题意有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色。将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间距离的和的收益。问收益最大值是多少。 N<=2000,0<=K<=N分析这题太强啦。...
  • qq_33229466
  • qq_33229466
  • 2017-04-14 09:20
  • 266

[树形DP] BZOJ 4033 [HAOI2015]树上染色

关键是状态设计 fu,if_{u,i} 不止表示u子树内i个黑点 子树内同色点两两之间的答案 其实应该是u子树内i个黑点 子树内同色点两两之间的答案以及子树内点和子树外点的答案 因为黑白点的个数是确定的 所以很好转移#include<cstdio> #include<cst...
  • u014609452
  • u014609452
  • 2017-04-22 20:25
  • 306
    个人资料
    • 访问:193286次
    • 积分:4925
    • 等级:
    • 排名:第6855名
    • 原创:305篇
    • 转载:0篇
    • 译文:0篇
    • 评论:72条
    最新评论