BZOJ4033 [HAOI2015]树上染色
本来是考虑, $ f[x][i][0/1] $ 表示 $ x $ 子树中有$i$个黑点,且 $ x $ 是白点/黑点。但是这里的答案是要统计不同的子树的贡献的。所以就gg了。
看了题解。
应该是要设$f[x][i]$表示$x$子树中有$i$个黑点,对答案的贡献。
转移的时候,就可以单独计算出$x->y$(y是x的儿子)这条边的贡献。
贡献怎么算呢?就是统计一下$y$内有多少黑(白)点、$y$外有多少黑(白)点,算一下有多少对,最后乘上$x->y$的边权。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
#define rg register
#define inf 0x3f3f3f3f
const int MX=4005;
template <typename _Tp> inline void read(_Tp&x){
char c=getchar();x=0;bool b=0;
while(c!='-'&&!isdigit(c))c=getchar();if(c=='-'){c=getchar();b=1;}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}if(b)x=-x;return;
}
int n,k,cnt;
int head[MX],sz[MX];
ll f[MX][MX];
struct Edge{int v,nxt,w;}edge[MX<<1];
inline void add_edge(int x,int y,int z){edge[++cnt].v=y;edge[cnt].w=z;edge[cnt].nxt=head[x];head[x]=cnt;}
void dfs(int x,int fa){
sz[x]=1;f[x][0]=f[x][1]=0;
for(int i=head[x];i;i=edge[i].nxt){
int y=edge[i].v;
if(y==fa) continue;
dfs(y,x);
for(int t=min(k,sz[x]+sz[y]);~t;t--)
for(int j=max(0,t-sz[x]);j<=min(sz[y],t);j++){//枚举子树y中黑点的数量
ll w=1LL*(1LL*j*(k-j)+1LL*(sz[y]-j)*(n-k-sz[y]+j))*edge[i].w;//当前边的贡献
f[x][t]=max(f[x][t],f[x][t-j]+f[y][j]+w);
}
sz[x]+=sz[y];
}
}
int main(){
// freopen("a.in","r",stdin);
read(n);read(k);
int x,y,z;
for(int i=1;i<n;i++){
read(x);read(y);read(z);
add_edge(x,y,z),add_edge(y,x,z);
}
memset(f,-inf,sizeof(f));
dfs(1,-1);
printf("%lld\n",f[1][k]);
return 0;
}
BZOJ4033 [HAOI2015]树上染色的更多相关文章
- BZOJ4033 HAOI2015 树上染色 【树上背包】
BZOJ4033 HAOI2015 树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白 ...
- [BZOJ4033][HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2437 Solved: 1034[Submit][Stat ...
- BZOJ4033: [HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3461 Solved: 1473[Submit][Stat ...
- [bzoj4033][HAOI2015]树上染色_树形dp
树上染色 bzoj-4033 HAOI-2015 题目大意:给定一棵n个点的树,让你在其中选出k个作为黑点,其余的是白点,收益为任意两个同色点之间距离的和.求最大收益. 注释:$1\le n\le 2 ...
- 【题解】 bzoj4033: [HAOI2015]树上染色* (动态规划)
bzoj4033,懒得复制,戳我戳我 Solution: 定义状态\(dp[i][j]\)表示\(i\)号节点为根节点的子树里面有\(j\)个黑色节点时最大的贡献值 然后我们要知道的就是子节点到根节点 ...
- 洛谷P3177||bzoj4033 [HAOI2015]树上染色
洛谷P3177 bzoj4033 根本不会做... 上网查了题解,发现只要在状态定义的时候就考虑每一条边全局的贡献就好了? 考虑边的贡献和修改状态定义我都想到了,然而并不能想到要结合起来 ans[i] ...
- 【树形背包】bzoj4033: [HAOI2015]树上染色
仔细思考后会发现和51nod1677 treecnt有异曲同工之妙 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 ...
- [BZOJ4033]:[HAOI2015]树上染色(树上DP)
题目传送门 题目描述 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加 ...
- BZOJ4033 [HAOI2015]树上染色 【树形dp】
题目 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间 ...
随机推荐
- WPF tooltip 根据父元素属性决定是否显示
例如:Placement为disable的时候,需要显示一段tooltip, 而当Placement为enable的时候,不显示 <Button Grid.Row="2" x ...
- PDW V2培训简记
最近有幸参加了微软专家进行的为期一周PDW培训,将一些知识点记录如下: 不知道PDW是什么东西的,简单介绍一下:这是微软与HP/Dell合作推出的SQL Server数据仓库一体机,由HP或DELL提 ...
- 【Python】Java程序员学习Python(七)— 文本类详解(字符串、str)
如果一个女孩子喜欢看龙猫,那么请珍惜她,呵护她 任何一门语言,字符串总是最基本也是最需要掌握的一个变量,想想入门的Hello World,输出的就是字符串. 官方文档:https://docs.pyt ...
- Oracle EBS 应收事务处理取值
SELECT ct.org_id ,ct.attribute1 bu_id --核算主体编号 ,ct.attribute2 dept_id --部门编号 ,hca.account_number ,hp ...
- 修改UIView的默认Layer后,修改View的值会动态修改Layer的值
修改UIView的默认Layer后,修改View的值会动态修改Layer的值 效果图: 如上图所示,当我们修改了一个UIView的子类中的Layer内置类型时(如上图中我们将CALayer直接替换成了 ...
- Apache下开启SSI配置,使html支持include包含
有的时候,我们的页面有公共的导航栏navbar,公共的脚注footer,那么我们就想把这些公共部分独立成一个html文件,在要引用的地方像引用js,css一样,给包含进来. Apache下开启SSI配 ...
- AltiumDesigner元器件搜索中英文对照
个人常用 扬声器 spearker 计量表(电流表,电压表) meter 变压器 Trans CT 肖特基二极管 D Schotty 额外补充 英文名称 中文释义 2N3904 NPN型 ...
- 加速安装 Sharepoint 2013 SP1
第一次安装把人吓了一跳,居然花了5个半小时.想想有一大堆服务器要升级,不得不想想有什么加速的办法. 试了好几种方法,以下的办法最为简单 1:停止 IIS ADMIN,WWW 服务 2:停止所有 sha ...
- NCE2
1.A private conversation Last week I went to the theatre. I had a very good seat. The play was very ...
- elif 相当于else&if
if 条件: 语句块 elif 条件: 语句块 ... else #elif好像要有一个else作为结尾