Link:

BZOJ 4033 传送门

Solution:

此题用到了计算贡献的方法,

将 多条路径的路径和  $->$ $\sum_{i=1}^{n-1} w[i]*cnt[i]$

这样我们由找出所有路径再计算转化成了对每条边计算其的贡献

由于所有节点只用2种选择,接下来就是比较套路的树形DP了

设 $dp[i][j]$ 为在以 $i$ 为根的子树中,有$j$个黑点时的$MAX$。

这样按照$dfs$序依次处理每个节点$x$,对子树背包$DP$,最后再加上$w_{<x,father[x]>}$的贡献即可

Code:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,int> P; const int MAXN=*;
vector<P> G[MAXN];
ll n,k,dp[MAXN][MAXN],sz[MAXN]; void tree_dp(int x,int anc,ll val)
{
sz[x]=;
for(int i=;i<G[x].size();i++)
{
int v=G[x][i].first;
if(v==anc) continue;
tree_dp(v,x,G[x][i].second);
for(int p=min(sz[x],k);p>=;p--)
for(int q=min(sz[v],k-p);q>=;q--)
dp[x][p+q]=max(dp[x][p+q],dp[x][p]+dp[v][q]);
sz[x]+=sz[v];
}
for(int i=;i<=min(sz[x],k);i++) //统计贡献
dp[x][i]+=val*((ll)i*(k-i)+(sz[x]-i)*((n-sz[x])-(k-i)));
} int main()
{
scanf("%lld%lld",&n,&k);
for(int i=;i<n;i++)
{
ll x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
G[x].push_back(P(y,z));
G[y].push_back(P(x,z));
}
tree_dp(,,);
printf("%lld",dp[][k]);
return ;
}

Review:

1、计算贡献的思想:

多个整体 拆分成 每个个体$*$出现次数的和

只要能快速地计算出贡献,依次考虑每个个体即可

2、树形$DP$的套路和注意事项:

套路:树形$DP$大部分时候都是依据$dfs$序在对子树背包$DP$

Note:(1)背包$DP$要从后往前更新,防止多次计算

(2)一般$size[x]$的更新都要放在对该子树更新完之后

3、点集的划分

该题的特殊性在于对点集严格划分为2堆,才能直接算出每种点的个数

当出现对点集严格划分的题目时,只要保存一个量,并考虑能否计算贡献

[BZOJ 4033] 树上染色的更多相关文章

  1. bzoj 4033 树上染色 - 树形动态规划

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

  2. [HAOI2015][bzoj 4033]树上染色(树dp+复杂度分析)

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

  3. BZOJ 4033: [HAOI2015]树上染色题解

    BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...

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

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

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

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

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

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

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

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

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

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

  9. [HAOI2015]树上染色 树状背包 dp

    #4033. [HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白 ...

随机推荐

  1. HDU1151:Air Raid(最小边覆盖)

    Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  2. Spring学习--使用 utility scheme 定义集合及 p命名空间

    util schema 定义集合: 使用基本的集合标签定义集合时 , 不能将集合作为独立的 Bean 定义 , 导致其他 Bean 无法引用该集合 , 所以无法在不同 Bean 之间共享集合. 可以用 ...

  3. 【BZOJ2648】SJY摆棋子 [KD-tree]

    SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己 ...

  4. bzoj3223 文艺平衡树 codevs3303 翻转区间

    splay模版题吧 只有区间翻转 至于为什么要把须翻转区间旋到根 因为查找一个区间可以先找出他左端点左边第一个点和右端点x右边第一个点y 然后将x旋到根节点 y旋到x的右儿子 这样x的右边的点就是所有 ...

  5. {CodeForces】788E New task && 汕头市队赛SRM06 D 五色战队

    D 五色战队 SRM 06 背景&&描述         游行寺家里人们的发色多种多样,有基佬紫.原谅绿.少女粉.高级黑.相簿白等.         日向彼方:吾令人观其气,气成五彩, ...

  6. 【BZOJ】1725: [Usaco2006 Nov]Corn Fields牧场的安排

    [算法]状压DP [题解]对于上一行的每个状态,每行进行DFS. #include<cstdio> #include<algorithm> #include<cstrin ...

  7. bzoj 1012 基础线段树

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1012 今儿一天状态不好,都没怎么刷题..快下课了,刷道水题.... 裸的线段树 /*** ...

  8. 从setting文件导包

    两种方式 from project.settings.py import s3_key 第二种: from django.conf import setting s3_key = settings.S ...

  9. python反爬之动态字体相关文档

    web_font的一些基本原理 https://blog.csdn.net/fdipzone/article/details/68166388 实例1 猫眼电影 http://www.cnblogs. ...

  10. Nightmare安装and一个小例子

    前端的功能测试 官方说法A high-level browser automation library,翻译过来就是高级浏览器自动化库 常用于UI测试和爬网 功能测试必须在真正浏览器做,现在有四种方法 ...