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]树上染色题解的更多相关文章

  1. BZOJ 4033[HAOI2015] 树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3188  Solved: 1366[Submit][Stat ...

  2. bzoj 4033: [HAOI2015]树上染色 [树形DP]

    4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...

  3. bzoj 4033: [HAOI2015]树上染色

    Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距 ...

  4. BZOJ 4033 [HAOI2015]树上染色 ——树形DP

    可以去UOJ看出题人的题解. 这样的合并,每一个点对只在lca处被考虑到,复杂度$O(n^2)$ #include <map> #include <ctime> #includ ...

  5. bzoj 4033: [HAOI2015]树上染色【树形dp】

    准确的说应该叫树上分组背包?并不知道我写的这个叫啥 设计状态f[u][j]为在以点u为根的子树中有j个黑点,转移的时候另开一个数组,不能在原数组更新(因为会用到没更新时候的状态),方程式为g[j+k] ...

  6. 【BZOJ】4033: [HAOI2015]树上染色 树上背包

    [题目]#2124. 「HAOI2015」树上染色 [题意]给定n个点的带边权树,要求将k个点染成黑色,使得 [ 黑点的两两距离和+白点的两两距离和 ] 最大.n<=2000. [算法]树上背包 ...

  7. BZOJ 4033: [HAOI2015]树上染色

    题解: 树形DP 思路,考虑每条边的贡献,即这条边两边的黑点数量相乘+白点数量相乘再成边长 #include<iostream> #include<cstdio> #inclu ...

  8. BZOJ4033:[HAOI2015]树上染色——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4033 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将 ...

  9. BZOJ4033: [HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3461  Solved: 1473[Submit][Stat ...

随机推荐

  1. kong CentOS7网关安装

    1.先安装postgres数据库,yum安装.yum install postgresql96yum install postgresql96-server配置环境变量export PGDATA=/v ...

  2. docker安装xxl-job

    一 安装mysql root@localhost tmp]# docker run -itd --name xxl-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD= ...

  3. prometheus 监控项

    此处记录prometheus监控项,exporter为 node_exporter vim rules.yml groups: - name: node rules: - alert: server_ ...

  4. cin.clear()、cin.sync()

    看机器学习时,发现之前学的C++代码忘了,cin.clear().cin.sync() cin.clear():将流中的所有状态值都重设为有效值 cin.sync():清空流 这个很有意思,如果没有c ...

  5. SPFA算法的判负环问题(BFS与DFS实现)

    经过笔者的多次实践(失败),在此温馨提示:用SPFA判负环时一定要特别小心! 首先SPFA有BFS和DFS两种实现方式,两者的判负环方式也是不同的.       BFS是用一个num数组,num[x] ...

  6. bootstrap editable初始化后表单

    function loadData() { var url = "${ctx }/sys/marketing/product/page"; $('#tablepager').boo ...

  7. 前端面试题-CSS选择器

    一.CSS选择器作用 CSS 选择器用于定位我们想要给予样式的 HTML 元素,但不只是在 CSS 中,JavaScript 对 CSS 的选择器也是支持的,比如 document.document. ...

  8. 20165218 《网络对抗技术》Exp6 信息收集与漏洞扫描

    Exp6 信息收集与漏洞扫描 实践过程记录 一.各种搜索技巧的应用 1_搜索网址目录结构 dir_scanner use auxiliary/scanner/http/dir_scanner This ...

  9. libusb获取usb设备的idVendor(vid),idProduct(pid),以及Serial Number

    发表于2015/6/23 21:55:11  4594人阅读 最近在做关于usb设备的项目,用到了libusb,发现关于这个的函数库的介绍,讲解很少,下面仅仅是简单展示一些基本的使用方法,以备后用. ...

  10. Abrt

    https://abrt.readthedocs.io/en/latest/faq.html#unpackaged