题意

题目链接

Sol

首先一个很显然的思路是直接用\(f[i][j] / g[i][j]\)表示\(i\)的子树中选了\(j\)个节点,该节点是否选的最小权值。但是直接这样然后按照树形背包的套路转移的话会有一种情况无法处理,就是说该节点不选,儿子节点也不选,这样我们就不清楚儿子节点的子节点的贡献了

一种暴力的做法是钦定该节点选,并重新枚举子树中的所有节点,转移出dp值之后背包合并

最后再把\(0\)号节点的合并一次

#include<bits/stdc++.h>
#define chmin(x, y) (x = x < y ? x : y)
#define chmax(x, y) (x = x > y ? x : y)
using namespace std;
const int MAXN = 1001, INF = 2e9 + 10;
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int N, K, a[MAXN], dis[MAXN], siz[MAXN], f[MAXN][MAXN], g[MAXN][MAXN], ans;
vector<int> v[MAXN];
void dfs2(int x, int fa, int root) {f[x][0] = dis[root] * a[x];for(int i = 0; i < v[x].size(); i++) {int to = v[x][i]; if(to == fa) continue;dfs2(to, x, root);for(int j = min(K, siz[x]); ~j; j--) for(int k = 0; k <= min(j, siz[to]); k++) chmax(f[x][j], f[to][k] + f[x][j - k]);}for(int i = siz[x]; i; i--) chmax(f[x][i], g[x][i]);
}
void dfs(int x, int fa) {dis[x] += dis[fa];  siz[x] = 1; for(int i = 0; i < v[x].size(); i++) {int to = v[x][i];if(to == fa) continue;dfs(to, x); siz[x] += siz[to];}g[x][0] = 0;memset(f, 0, sizeof(f));for(int i = 0; i < v[x].size(); i++) {int to = v[x][i]; if(to == fa) continue;dfs2(to, x, x);for(int j = min(K, siz[x]); ~j; j--) for(int k = 0; k <= min(j, siz[to]); k++) chmax(g[x][j], f[to][k] + g[x][j - k]);}for(int i = min(K, siz[x]); i; i--) g[x][i] = g[x][i - 1] + dis[x] * a[x];
}
int main() {N = read(); K = read();for(int i = 1; i <= N; i++) {a[i] = read(); int fa = read(); dis[i] = read();v[fa].push_back(i); }dfs(0, -1);for(int i = 1; i <= N; i++) ans += dis[i] * a[i];memset(f, 0, sizeof(f));int x = 0;for(int i = 0; i < v[x].size(); i++) {int to = v[x][i]; dfs2(to, x, x);for(int j = min(K, siz[x]); ~j; j--) for(int k = 0; k <= min(j, siz[to]); k++) chmax(f[x][j], f[to][k] + f[x][j - k]);}int out = INF;for(int i = 0; i <= K; i++) out = min(out, ans - f[0][i]);printf("%d\n", out);return 0;
}

BZOJ1812: [Ioi2005]riv(树形dp)相关推荐

  1. bzoj1812[Ioi2005] riv

    题目链接:bzoj1812 题目大意: 给你一颗有n个节点的树根为0的树.树根一定是个标记点.让你再在树上标记k个点.使得 每个点的点权乘以它到往上走遇到的第一个标记点的距离 的和最小. 题解: 树形 ...

  2. [bzoj1812][ioi2005]riv(树上dp)

    [题目链接]http://www.lydsy.com/JudgeOnline/problem.php?id=1812 [解题思路]转化为二叉树更方便.可以从Bytetown向后dp同时记录每个点在By ...

  3. BZOJ1812 RIV 树形dp

    Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一 ...

  4. 【bzoj 1812】[Ioi2005]riv(树形dp)

    1812: [Ioi2005]riv Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 433  Solved: 246 [Submit][Status] ...

  5. [bzoj1812][IOI2006]riv_多叉树转二叉树_树形dp

    riv bzoj-1812 IOI-2006 题目大意:给定一棵n个点树,要求在上面建立k个收集站.点有点权,边有边权,整棵树的代价是每个点的点权乘以它和它的最近的祖先收集站的距离积的和. 注释:$1 ...

  6. 洛谷P3354 [IOI2005]Riv 河流——“承诺”DP

    题目:https://www.luogu.org/problemnew/show/P3354 状态中要记录一个"承诺",只需相同承诺之间相互转移即可: 然后就是树形DP的套路了. ...

  7. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  8. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  9. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  10. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

最新文章

  1. 《数据科学家养成手册》--第十一章算法学2---(非监督,监督贝叶斯概率以及损失函数)
  2. php 连接数据库 pod,PHP PDO类解决数据库连接问题
  3. 验证码广告:站长增加收入新渠道
  4. 不止性能优化,移动端 APM 产品研发技能
  5. session实现购物车
  6. 飞鸽应用于企业解决方案
  7. 运维之Linux秋招重点(根据面经和常见笔试题总结,持续更新)
  8. 可以载入史册的新名词:市场经济(蝳品经济)的上瘾依赖特性
  9. 思科 Cisco CCNA 题库、
  10. 计算机鼠标老跳动,鼠标跳动是什么原因 鼠标经常抖动的解决方法
  11. 你每天应该吃多少水果?
  12. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之 Response Selection
  13. python列表元素比较大小_python列表怎么比较大小
  14. Halcon模版匹配
  15. 计算机课程教学措施,计算机教学改革主要内容和措施
  16. appollo消息服务器,搭建Apache apollo消息队列服务、简单访问
  17. sql语句中大于 , 大于等于 , 小于 , 小于等于
  18. 自学python(2):利用opencv实现读图,显示,画框,裁剪的python代码
  19. CHW,HCW顺序和numpy.transpose函数
  20. 【python接口自动化】csdn涨薪技术- DDT数据驱动测试

热门文章

  1. Atitit 命令行执行springboot程序 目录 1.1. 执行spel表达式,调用app main,获取context 1 1.2. 直接在Application main函数内执行 1
  2. Atitit uri url urn 的概念区别 与联系 目录 1.1. 概念图 uri包括url和urn。。Urn一般是相对路径。。。 1 1.2. 统一资源名称 (Uniform Resourc
  3. Atitit rss没落以及替代品在线阅读器
  4. Atitit.aticmd v4  新特性q39 添加定时器释放功能
  5. atitit.MIZIAN 陕北方言 特有词汇 大词典 attilax 整理 h--n v1 q31.xlsx
  6. Atitit.故障排除系列---php 程序网站数据库错误排除流程
  7. paip.提升安全性--CRSF跨站请求伪造的检测与防范
  8. paip.手机ROOT过程总结
  9. PAIP.一些流氓软件的流氓营销方法.txt
  10. PAIP.pdf使用