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. 修改innodb_flush_log_at_trx_commit参数提升insert性能

    最近,在一个系统的慢查询日志里发现有个insert操作很慢,达到秒级,并且是比较简单的SQL语句,把语句拿出来到mysql中直接执行,速度却很快. 这种问题一般不是SQL语句本身的问题,而是在具体的应 ...

  2. HDU 多校对抗第三场 L Visual Cube

    Problem L. Visual Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java ...

  3. 用filters定制化spring的包扫描

    Fiter的信息如下: Filter的类型有:annotation(这是spring默认的),assignable,aspectj, regex,custom 首先看一下我这个demo的目录结构: 上 ...

  4. docker compose,link,Odoo

    1.报错: /usr/bin/docker-current: Error response from daemon: driver failed programming external connec ...

  5. React.js基础知识

    一. react.js的基本使用方法 (1)快速使用,hello world <div id="app"></div> <script src=&qu ...

  6. bzoj 1251 裸splay

    裸的splay,只需要注意 max[-1]:=-maxlongint 就行了,否则在update的时候子节点的 max值会在max[-1]里选 /*************************** ...

  7. wxpython SizerItem的大小控制

    wxpython SizerItem的大小控制 proportion控制控件相对大小,proportion如果为0,表示默认大小.比如一个box里面有两个相同控件A,B,如果A,B的proportio ...

  8. [Leetcode Week3]Course Schedule

    Course Schedule题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/course-schedule/description/ Descript ...

  9. react native windows 搭建(完整版)

    声明:用windows 搭建的react native只能开发安卓应用 1.准备安装java jdk,以及Android SDK 传送门: java   JDK   Android SDK(自行寻找) ...

  10. Java易错知识点(2) - 在读取Cookie时除了Key,Value是得不到其他信息的

    全文总结: 在读取Cookie,然后操作时,除了getName(),getValue()外,不要妄图得到其他信息,如下方法不会得到值的: cookie.getMaxAge(); cookie.getD ...