BZOJ 4033: [HAOI2015]树上染色题解
BZOJ 4033: [HAOI2015]树上染色题解(树形dp)
标签:题解
阅读体验:https://zybuluo.com/Junlier/note/1327400
原题地址:
BZOJ 4033: [HAOI2015]树上染色题解
洛谷 P3177 [HAOI2015]树上染色
应该各大\(oj\)都有。。。可以多倍经验。。。
一眼树形\(dp\)是吧
因为要选出\(K\)个黑点,所以知道子树内有多少个黑点,就知道子树外有多少个黑点
那么设dp[now][j]表示在\(now\)的子树内选了\(j\)个黑点对答案的贡献
考虑每条边对答案的贡献进行\(dp\)
枚举已经处理完的子树选出了\(j\)个,当前处理的子树选出了\(k\)个
一定有 (\(now\)是当前节点,\(qw\)是子树节点,\(Val\)是now-qw边对答案的贡献)
dp[now][j+k]=MAX(dp[now][j+k],dp[now][j]+dp[qw][k]+Val);
那么怎么算出\(Val\)呢,这个不难
Val=k*(K-k)*w+(siz[qw]-k)*(n-K-siz[qw]+k)*w;
子树黑点数×外面黑点数×边权 子树白点数×外面白点数×边权
那么这个题目不就很简单吗。。。然而手写MAX忘记开long long Wa了很久
#include<bits/stdc++.h>
#define il inline
#define rg register
#define ldb double
#define lst long long
#define rgt register int
#define N 2050
#define qw ljl[i].to
using namespace std;
const int Inf=1e9;
il lst MAX(rg lst x,rg lst y){return x>y?x:y;}
il int MIN(rgt x,rgt y){return x<y?x:y;}
il lst read()
{
rg lst s=0,m=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
}
int n,K,Rt;
int hd[N],siz[N],cnt;
lst dp[N][N];//The MAX contribution of [At now][got j black points]
struct EDGE{int to,nxt,v;}ljl[N<<1];
il void Add(rgt p,rgt q,rgt o){ljl[++cnt]=(EDGE){q,hd[p],o},hd[p]=cnt;}
void Dfs(rgt now,rgt fm)
{
siz[now]=1;
for(rgt i=hd[now],w;i;i=ljl[i].nxt)
{
if(qw==fm)continue;Dfs(qw,now),w=ljl[i].v;
for(rgt j=MIN(siz[now],K);j>=0;--j)
for(rgt k=MIN(siz[qw],K-j);k>=0;--k)
{
rg lst Val=1LL*k*(K-k)*w+1LL*(siz[qw]-k)*(n-K-siz[qw]+k)*w;
//The contribution of the edge-black&white
dp[now][j+k]=MAX(dp[now][j+k],dp[now][j]+dp[qw][k]+Val);
}
siz[now]+=siz[qw];
}
}
int main()
{
n=read(),K=read();
srand(time(NULL)),Rt=rand()%n+1;
for(rgt i=1;i<n;++i)
{
rgt p=read(),q=read(),o=read();
Add(p,q,o),Add(q,p,o);
}Dfs(Rt,0);
printf("%lld\n",dp[Rt][K]);
return 0;
}
BZOJ 4033: [HAOI2015]树上染色题解的更多相关文章
- BZOJ 4033[HAOI2015] 树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3188 Solved: 1366[Submit][Stat ...
- bzoj 4033: [HAOI2015]树上染色 [树形DP]
4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...
- bzoj 4033: [HAOI2015]树上染色
Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距 ...
- BZOJ 4033 [HAOI2015]树上染色 ——树形DP
可以去UOJ看出题人的题解. 这样的合并,每一个点对只在lca处被考虑到,复杂度$O(n^2)$ #include <map> #include <ctime> #includ ...
- bzoj 4033: [HAOI2015]树上染色【树形dp】
准确的说应该叫树上分组背包?并不知道我写的这个叫啥 设计状态f[u][j]为在以点u为根的子树中有j个黑点,转移的时候另开一个数组,不能在原数组更新(因为会用到没更新时候的状态),方程式为g[j+k] ...
- 【BZOJ】4033: [HAOI2015]树上染色 树上背包
[题目]#2124. 「HAOI2015」树上染色 [题意]给定n个点的带边权树,要求将k个点染成黑色,使得 [ 黑点的两两距离和+白点的两两距离和 ] 最大.n<=2000. [算法]树上背包 ...
- BZOJ 4033: [HAOI2015]树上染色
题解: 树形DP 思路,考虑每条边的贡献,即这条边两边的黑点数量相乘+白点数量相乘再成边长 #include<iostream> #include<cstdio> #inclu ...
- BZOJ4033:[HAOI2015]树上染色——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4033 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将 ...
- BZOJ4033: [HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3461 Solved: 1473[Submit][Stat ...
随机推荐
- Mybatis mysql 一个搜索框多个字段模糊查询 几种方法
第一种 or 根据搜索框给定的关键词,模糊搜索用户名和账号都匹配的用户集合 <select id="list" parameterType="com.user.Us ...
- mysql ALTER TABLE语句 语法
mysql ALTER TABLE语句 语法 作用:用于在已有的表中添加.修改或删除列.无铁芯直线电机 语法:添加列:ALTER TABLE table_name ADD column_name da ...
- 批量下载文件asp.net
一.实现步骤 在用户操作界面,由用户选择需要下载的文件,系统根据所选文件,在服务器上创建用于存储所选文件的临时文件夹,将所选文件拷贝至临时文件夹.然后调用 RAR程序,对临时文件夹进行压缩,然后输出到 ...
- Python黑科技:FuckIt.py
说起 Python 强大的地方,你可能想到是它的优雅.简洁.开发速度快,社区活跃度高.但真正使得这门语言经久不衰的一个重要原因是它的无所不能,因为社区有各种各样的第三库,使得我们用Python实现一个 ...
- 金蝶K3 WISE 13.1版本服务器虚拟机环境部署
闲来无事,整个13.1版本的金蝶玩玩. 系统环境:WIN2008 R2,x64位 数据库:MSSQL 2008 R2,X64位 记录下操作步骤: 1.准备安装软件,见图: 2.安装资源包,.net3. ...
- 《第40天 : JQuery - 手风琴列表》
源码下载地址:链接:https://pan.baidu.com/s/1x9c1... 提取码:2bzr 如果有赞就很幸福了. 今天要和你们分享的是我看了JQuery库的手风琴列表样式.它的核心在于它的 ...
- Java 有几种修饰符?分别用来修饰什么
4种修饰符 访问权限 类 包 子类 其他包 public ∨ ∨ ∨ ∨ protect ∨ ∨ ∨ × default ∨ ∨ ...
- ES6数组的拓展
扩展运算符 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // 1 2 3 c ...
- python-又来练习题--输出一个字符串中最长的子字符串及其长度
一.有个字符串 str= '$sd1#111$svda123!!!221&eSSDSyyyyyyDG^svda121^svda124^1111111111111' 包含特殊字符.数字和字母,输 ...
- Python学习之==>日志模块
一.logging模块介绍 logging是Python中自带的标准模块,是Python中用来操作日志的模块. 1.控制台输出日志 import logging logging.basicConfig ...