BZOJ1812: [Ioi2005]riv(树形dp)
题意
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)的更多相关文章
- 【BZOJ1812】[Ioi2005]riv 树形DP
[BZOJ1812][Ioi2005]riv Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河, ...
- BZOJ 1812: [Ioi2005]riv( 树形dp )
树背包, 左儿子右兄弟来表示树, dp(x, y, z)表示结点x, x的子树及x的部分兄弟共建y个伐木场, 离x最近的伐木场是z时的最小代价. 时间复杂度O(N^2*K^2) ----------- ...
- BZOJ_1812_[Ioi2005]riv_树形DP
BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了 ...
- bzoj1812 [Ioi2005]riv
riv 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫B ...
- bzoj1812 [IOI2005]riv河流
题目链接 problem 给出一棵树,每个点有点权,每条边有边权.0号点为根,每个点的代价是这个点的点权\(\times\)该点到根路径上的边权和. 现在可以选择最多K个点.使得每个点的代价变为:这个 ...
- [bzoj1812][IOI2006]riv_多叉树转二叉树_树形dp
riv bzoj-1812 IOI-2006 题目大意:给定一棵n个点树,要求在上面建立k个收集站.点有点权,边有边权,整棵树的代价是每个点的点权乘以它和它的最近的祖先收集站的距离积的和. 注释:$1 ...
- rivers ioi2005 树形dp
说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕: 题目很简单,树形dp,正常做30分钟,硬是做了好几个小时,真是伤心. 题解不写了,只是吐个槽,网上没有用背包写的dp,全是左儿子右兄弟写法, ...
- 洛谷P3354 [IOI2005]Riv 河流——“承诺”DP
题目:https://www.luogu.org/problemnew/show/P3354 状态中要记录一个“承诺”,只需相同承诺之间相互转移即可: 然后就是树形DP的套路了. 代码如下: #inc ...
- 1812: [Ioi2005]riv
1812: [Ioi2005]riv Time Limit: 10 Sec Memory Limit: 64 MB Submit: 635 Solved: 388 [Submit][Status][D ...
随机推荐
- Python的科学计算包matplotlib setup
回想起大学四年 专业一直使用matlab,然而我却没在PC上装成功过,以前懒于思考这种数学工具的作用,直到最近,大学同学研究生要毕业了,几经交流,和自己阅读了一些机器学习的教材之后,发觉科学计算包和画 ...
- Cocoa对象——根类
[转载自:http://mobile.51cto.com/iphone-274229.htm] Cocoa对象 根类是本文要介绍的内容,仅凭Objective-C语言和运行环境并不足以构造哪怕是最简单 ...
- php脚本cli 模式运行
参考文章 http://rapheal.sinaapp.com/2013/11/20/php_zend_hello_world/ http://www.douban.com/note/33788568 ...
- [redis]复制机制,调优,故障排查
在redis的安装目录下首先启动一个redis服务,使用默认的配置文件,作为主服务 ubuntu@slave1:~/redis2$ ./redis-server ./redis.conf & ...
- hive连接mysql遇到的问题
启动hive之前应该先启动metastore,也是在bin目录下:./hive --service metastore &然后再启动hive: ./hive 今天连接hive时总是报错:Una ...
- 配置bootstrap环境
bootstrap是一个优雅,灵活,可扩展的前端工具集,可搭建WEB页面的HTML,CSS,JavaScript工具集,最重要的是它的栅格系统. 这里不做更多的详细介绍具体可参照官方网站:http:/ ...
- ubuntu 14.04网卡配置以及关闭防火墙
一.Ubuntu网卡配置如下: 在文件/etc/network/interfaces中进行以下配置 auto lo iface lo inet lookback auto eth0 iface eth ...
- 祝福csdn回望2014,展望2015 大致可以这样总结和展望
祝福CSDN回望2014,展望2015 大致可以这样总结和展望 回望2014,大致可以这样总结: 从寻觅一架飞机开始,到寻觅另一架飞机结束,中间觅了几天金正恩. 全年都在寻觅收钱的人.送钱的人和带着钱 ...
- (转)InnoDB存储引擎MVCC实现原理
InnoDB存储引擎MVCC实现原理 原文:https://liuzhengyang.github.io/2017/04/18/innodb-mvcc/ 简单背景介绍 MySQL MySQL是现在最流 ...
- 【Ubuntu】执行定时任务(cron)
1.打开定时任务配置文件 crontab -e 2.编写定时任务时间 命令和脚本例如: /3 * * * * /soft/config/test.sh 前5个字段为时间,后面的一个为命令 前5个含义为 ...