链接:https://ac.nowcoder.com/acm/problem/19996
来源:牛客网

题目描述
有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色。
将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间距离的和的收益。问收益最大值是多少。
输入描述:
第一行两个整数N,K。
接下来N-1行每行三个正整数fr,to,dis,表示该树中存在一条长度为dis的边(fr,to)。
输入保证所有点之间是联通的。N ≤ 2000,0 ≤ K ≤ N
输出描述:
输出一个正整数,表示收益的最大值。
示例1
输入
复制
5 2
1 2 3
1 5 1
2 3 1
2 4 2
输出
复制
17
说明
【样例解释】
将点1,2染黑就能获得最大收益。
这种题目一看就是枚举每条边的贡献。通过这道题目接触了树形背包。。
dp[i][j]表示着以i为根的子树中有j个点染成黑色的最大价值。
子树中的每个点都有两种状态,染色或者是不染色。所以类似于01背包。
代码如下:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x7f7f7f7f
using namespace std;const int maxx=2e3+100;
struct edge{int to,next;ll w;
}e[maxx<<1];
int head[maxx<<1],tot,size[maxx];
ll dp[maxx][maxx];
int n,k;
/*-------------事前准备-------------*/
inline void init()
{memset(head,-1,sizeof(head));for(int i=0;i<=n;i++)for(int j=0;j<=n;j++) dp[i][j]=-inf;//初始化为负无穷大,tot=0;
}
inline void add(int u,int v,ll w)
{e[tot].to=v,e[tot].next=head[u],e[tot].w=w,head[u]=tot++;
}
/*------------树形dp-------------*/
inline void dfs(int u,int f)
{size[u]=1;dp[u][0]=dp[u][1]=0;ll ans;for(int i=head[u];i!=-1;i=e[i].next){int to=e[i].to;ll w=e[i].w;if(to==f) continue;dfs(to,u);size[u]+=size[to]; for(int j=size[u];j>=0;j--)//树形背包的模板,枚举以u为根的子树中染j个结点的最大值{for(int K=0;K<=size[to]&&K<=j;K++)//这j个结点中有K个在以to为节点的子树中{ans=(ll)(K)*(k-K)+(ll)(size[to]-K)*(ll)((n-size[to]-k+K));ans*=w;ans+=dp[to][K];//还要加上子树中已经染了K个结点的情况dp[u][j]=max(dp[u][j],dp[u][j-K]+ans);//状态转移方程:dp[u][j]和dp[u][j-K]+ans比较。}}}
}
int main()
{int x,y;ll w;while(~scanf("%d%d",&n,&k)){init();for(int i=1;i<n;i++){scanf("%d%d%lld",&x,&y,&w);add(x,y,w);add(y,x,w);}dfs(1,0);printf("%lld\n",dp[1][k]);}return 0;
}

努力加油a啊,(o)/~

[HAOI2015]树上染色(树形dp,树形背包)相关推荐

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

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

  2. bzoj4033: [HAOI2015]树上染色(树形dp)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 3269  Solved: 1413 [Submit][St ...

  3. bzoj 4033: [HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1786  Solved: 754 [Submit][Sta ...

  4. Luogu P3177 [HAOI2015] 树上染色(树上背包)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P3177 [HAOI2015] 树上染色 有一棵点数为 NNN 的树,树边有边权.给你一 ...

  5. 树形dp+树形结构总结

    总结 最近写了好多树形dp+树形结构的题目,这些题目变化多样能与多种算法结合,但还是有好多规律可以找的. 先说总的规律吧! 一般来说树形dp在设状态转移方程时都可以用f[i][]表示i这颗子树怎么怎么 ...

  6. [BZOJ4033][HAOI2015]树上染色

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2108  Solved: 901 [Submit][Sta ...

  7. HYSBZ - 1017 魔兽地图【树形DP依赖性背包】

    HYSBZ - 1017 Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defen ...

  8. bzoj4033 [HAOI2015]树上染色

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 重要的思路:与其考虑每一个点对的贡献,不如考虑每条边的贡献(==被经过了几次)! 树形 ...

  9. [HAOI2015]树上染色

    嘟嘟嘟 首先这一眼看出来,要树形dp. 然后发现状态不好设,刚开始我想的是dp[i][j]表示以\(i\)为根的子树,选了\(j\)个黑点的最大价值.结果就不会转移了. 转移的时候想考虑\(<u ...

最新文章

  1. a different object with the same identifier value was already associated with the session:
  2. UML和模式应用(1):面向对象的分析与设计
  3. Android Service完全解析,关于服务你所需知道的一切(下)
  4. TF学习——TF之TFOD:基于TFOD AP训练ssd_mobilenet预模型+faster_rcnn_inception_resnet_v2_模型训练过程(TensorBoard监控)全记录
  5. boost::hana::detail::has_duplicates用法的测试程序
  6. C语言实现pid算法(附完整源码)
  7. [转]Linux中如何自动启动服务
  8. rabbitMq多个队列多种任务同时监听
  9. 致远项目管理SPM系统案例:中建二局项目管理系统
  10. html5 LivePlayer 实时播放rtmp
  11. LTE网络CQI机制
  12. 修改 Windows 10 主题字体
  13. Buck-Boost 变换器和红外 LED 驱动器
  14. SpringBoot初始化过程核心源码剖析
  15. 实例分析SQL中除法的三种写法
  16. SQL中CONVERT()函数用法详解
  17. 接口的Mock测试及Mockito使用
  18. Keynote教程 – 将演示文稿发布到WordPress博客中
  19. vos3000打电话没声音 排除法解决问题
  20. 电动车质量排名前十名有哪些?看完这篇文章你就知道啦

热门文章

  1. CrystalDiskInfo的下载使用
  2. 浅谈Handler机制
  3. python文件打开模式中、使用w模式、文件指针指向_被python文件模式“w+”所迷惑
  4. 如何查看oracle用户级别,用户级别的Oracle 导入导出
  5. osg多视景器实现投影墙
  6. C++17下map不常用的接口函数汇总
  7. matlab 设计 18db,基于混沌理论的微弱MPSK信号解调方案设计
  8. matlab文件目录表示,Matlab - 文件目录路径操作_读取不同路径下的相同文件名表格...
  9. 211计算机实力末尾的学校,实力最弱的十所985大学是哪几所?选择末尾985好还是选211好?...
  10. python传输大文件_python之socket运用之传输大文件