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. scala spark(2.10)读取kafka(2.11_1.0.0)示例

    1.pom加载jar包 <dependency> <groupId>org.apache.spark</groupId> <artifactId>spa ...

  2. 上采样 及 Sub-pixel Convolution (子像素卷积)

    参考:https://blog.csdn.net/leviopku/article/details/84975282 参考:https://blog.csdn.net/g11d111/article/ ...

  3. CVPR 2018 DeepGlobe

    在刚刚结束的CVPR2018: DeepGlobe Road Extraction Challenge(全球卫星图像道路提取)比赛中,北京邮电大学信息与通信工程学院模式识别实验室张闯老师指导的研究生周 ...

  4. HDU 2546 饭卡(01背包)

    题目代号:HDU 2546 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 饭卡 Time Limit: 5000/1000 MS (Java/ ...

  5. socket编程相关阐述

    一.socket初识 ①服务端 import socket server = socket.socket() server.bind(('127.0.0.1', 8080)) server.liste ...

  6. springboot(一).初识springboot以及基本项目搭建

    初识springboot 以及基本项目搭建 由于新的项目需要搭建后台框架,之前的springmvc架构也使用多次,在我印象中springboot的微服务架构更轻量级更容易搭建,所以想去试试spring ...

  7. Eating Plan

    Eating Plan 2019南昌G 模数为合数,所以只有约3000个数字不为0 记录一下不为0的数字位置 H[x]代表距离为x的连续段的数字和的最大值 处理出H[x] 再H[x] = max(H[ ...

  8. [design pattern](5) Factory Method

    前言 在前面一章博主介绍了简单工厂模式(Simple Factory),接着上面的章节,今天博主就来介绍下工厂方法模式(Factory Method). 思考题 首先,让我们来思考下面的问题: 在上一 ...

  9. PHPStrom 配置DataSource来管理数据库

    在使用phpstrom的时候经常会连接数据库,使用phpstrom自带的工具,可以连接到mysql数据库,管理和查看mysql,非常方便 这个连接是官方文档教你如何配置http://www.jetbr ...

  10. windows7 中 wacom数位板如何关闭点击水波 和长按右键这两个特效

    就是点住笔尖不动,就会弹出右键,这个功能是微软操作系统具有的一项功能,,如果您感觉不便,可以按以下方法将其去掉: 1.打开"控制面板--笔和触摸--笔选项--按下并保持--设置": ...