BZOJ4033: [HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 3461 Solved: 1473
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 3
1 5 1
2 3 1
2 4 2
Sample Output
【样例解释】
将点1,2染黑就能获得最大收益。
HINT
2017.9.12新加数据一组 By GXZlegend
Source
思路:我们知道有道题,是求两两距离之和,我们可以一遍DFS得到,即每条边的贡献=sz[v]*(N-sz[v])*Len[i];此题也一样,我们用dp[u][x]表示以u为根的子树里有x个黑点的最大收益。 不难得到DP方程。
注意这样的背包复杂度会偏大:
for(int i=min(sz[u],K);i>=;i--){
for(int j=;j<=min(i,sz[v]);j++){
dp[u][i]=max(dp[u][i],dp[u][i-j]+dp[v][j]+1ll*j*(K-j)*Len[p[e]]+1ll*(sz[v]-j)*(N-K-sz[v]+j)*Len[p[e]]);
}
}
应该用如下:788ms
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
const int maxn=;
int Laxt[maxn],Next[maxn<<],To[maxn<<],Len[maxn<<];
int N,K,sz[maxn],cnt; ll dp[maxn][maxn];
void add(int u,int v,int w){
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=w;
}
void dfs(int u,int f){
sz[u]=; dp[u][]=dp[u][]=;
for(int e=Laxt[u];e;e=Next[e]){
int v=To[e]; if(v==f) return ;
dfs(v,u);
for(int i=min(sz[u],K);i>=;i--){
for(int j=min(sz[v],K-i);j>=;j--){
dp[u][i+j]=max(dp[u][i+j],dp[u][i]+dp[v][j]+1ll*j*(K-j)*Len[e]+1ll*(sz[v]-j)*(N-K-sz[v]+j)*Len[e]);
}
}
sz[u]+=sz[v];
}
}
int main()
{
int u,v,w;
scanf("%d%d",&N,&K);
rep(i,,N-){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w); add(v,u,w);
}
dfs(,);
printf("%lld\n",dp[][K]);
return ;
}
也可以先排序:692ms
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
const int maxn=;
int Laxt[maxn],Next[maxn<<],To[maxn<<],Len[maxn<<];
int N,K,sz[maxn],cnt,son[maxn]; ll dp[maxn][maxn];
bool cmp(int w,int v) {return sz[To[w]]<sz[To[v]]; }
void add(int u,int v,int w){
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=w;
}
void dfs1(int u,int f){
sz[u]=; for(int e=Laxt[u];e;e=Next[e]){
if(To[e]!=f) dfs1(To[e],u),sz[u]+=sz[To[e]];
}
}
void dfs2(int u,int f){
int tot=,p[maxn]; dp[u][]=dp[u][]=; son[u]=;
for(int e=Laxt[u];e;e=Next[e]) if(To[e]!=f) p[++tot]=e;
sort(p+,p+tot+,cmp);
for(int e=;e<=tot;e++){
int v=To[p[e]]; if(v==f) return ;
dfs2(v,u);
for(int i=min(son[u],K);i>=;i--){
for(int j=min(son[v],K-i);j>=;j--){
dp[u][i+j]=max(dp[u][i+j],dp[u][i]+dp[v][j]+1ll*j*(K-j)*Len[p[e]]+1ll*(sz[v]-j)*(N-K-sz[v]+j)*Len[p[e]]);
}
}
son[u]+=son[v];
}
}
int main()
{
int u,v,w;
scanf("%d%d",&N,&K);
rep(i,,N-){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w); add(v,u,w);
}
dfs1(,); dfs2(,);
printf("%lld\n",dp[][K]);
return ;
}
BZOJ4033: [HAOI2015]树上染色(树形DP)的更多相关文章
- [BZOJ4033][HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2437 Solved: 1034[Submit][Stat ...
- bzoj4033 [HAOI2015]树上染色——树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 树形DP,状态中加入 x 与父亲之间的边的贡献: 边权竟然是long long... ...
- 洛谷 P3177 [HAOI2015]树上染色 树形DP
洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...
- 【BZOJ4033】[HAOI2015]树上染色 树形DP
[BZOJ4033][HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染 ...
- bzoj 4033: [HAOI2015]树上染色 [树形DP]
4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...
- BZOJ 4033 [HAOI2015]树上染色 ——树形DP
可以去UOJ看出题人的题解. 这样的合并,每一个点对只在lca处被考虑到,复杂度$O(n^2)$ #include <map> #include <ctime> #includ ...
- BZOJ4033 HAOI2015 树上染色 【树上背包】
BZOJ4033 HAOI2015 树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白 ...
- [bzoj4033][HAOI2015]树上染色_树形dp
树上染色 bzoj-4033 HAOI-2015 题目大意:给定一棵n个点的树,让你在其中选出k个作为黑点,其余的是白点,收益为任意两个同色点之间距离的和.求最大收益. 注释:$1\le n\le 2 ...
- 【BZOJ4033】【HAOI2015】树上染色 树形DP
题目描述 给你一棵\(n\)个点的树,你要把其中\(k\)个点染成黑色,剩下\(n-k\)个点染成白色.要求黑点两两之间的距离加上白点两两之间距离的和最大.问你最大的和是多少. \(n\leq 200 ...
随机推荐
- 3.1 Templates -- Handlerbars Basics(Handlerbars基础知识)
一.简介 Ember.js使用Handlerbars模板库来强化应用程序的用户界面.它就像普通的HTML,但也给你嵌入表达式去改变现实的内容. Ember使用Handlerbars并且用许多新特性去扩 ...
- Linux系统——公网定制化yum仓库部署
1)搭建公网源yum仓库 安装wget aliyun源 # wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel ...
- CSS样式有哪些常用的属性?
一般的一个DIV的CSS设置属性有:margin,padding,width,height,font-size,text-align,background,float,border CSS样式有哪些常 ...
- 2018-2019 Russia Open High School Programming Contest
A. Company Merging Solved. 温暖的签到. #include<bits/stdc++.h> using namespace std; ; typedef long ...
- Spring MVC 复习笔记04
复习 springmvc框架: DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器:根据url查找Handler.(可以通 ...
- java第五天
p37: 练习1 /** * Created by xkfx on 2017/2/22. */ public class DataOnly { int anInt; char aChar; publi ...
- 20145219《网络对抗》MSF基础应用
20145219<网络对抗>MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:把实现设置好的东西送到要攻击的主机里. payl ...
- 编译 Tensorflow 1.10 + CUDA9.2 + MKL【转】
本文转自:https://www.solarck.com/compile-tensorflow-gpu.html 我的电脑系统是基于 Archlinux 的 Manjaro,软件包更新的比较激进,很早 ...
- Jenkins报错Error cloning remote repo 'origin'
Jenkins控制台输出报错 输出ERROR: Error cloning remote repo 'origin' 这行报错只能说明是git有问题,其他没什么有用的信息. 浏览器中Ctrl+F查找E ...
- BZOJ 2594 【WC2006】 水管局长数据加强版
题目链接:水管局长数据加强版 好久没写博客了…… 上次考试的时候写了一发LCT,但是写挂了……突然意识到我已经很久没有写过LCT了,于是今天找了道题来练练手. 首先,LCT这里不讲.这道题要求支持动态 ...