[IOI2005]河流
Description
Solution
一道树形dp的题。
首先考虑转移,很简单,就是这个点做不做伐木场。为了方便转移,我们定义状态为\(f_{i,j,k}\)表示点\(i\)及其兄弟的子树中,选了\(k\)个伐木场,且\(j\)是点\(i\)的父亲中距离点\(i\)最近的那个伐木场,这时的总花费。
转移就比较好写了:
f_{i,j,k} = min\{ f_{son_i, i, l} + f_{bro_i, j, k-l-1} \} \mbox{(选i)}
\]
同时,为了方便这样转移,我们采用左儿子右兄弟法存树。
Code
#include <cstdio>
#include <cstring>
#include <algorithm>
const int N = 100 + 10;
const int M = 2*N;
const int INF = 0x7f7f7f7f;
int ls[N], rs[N], dep[N], w[N], fa[N];
int n, K;
int que[N], tot;
int f[N][N][N];
void dfs(int x, int deep) {
dep[x] += deep;
que[++tot] = x;
int i = ls[x];
while (i) {
dfs(i, dep[x]);
i = rs[i];
}
}
int main() {
memset(fa, -1, sizeof fa);
memset(f, 0x7f, sizeof f);
memset(f[0], 0, sizeof f[0]);
scanf("%d%d", &n, &K);
for (int i = 2, v, d; i <= n+1; ++i) {
scanf("%d%d%d", &w[i], &v, &d);
++v;
rs[i] = ls[v];
ls[v] = i;
dep[i] = d;
fa[i] = v;
}
dfs(1, 0);
for (int i = n+1; i > 1; --i) {
int &x = que[i];
for (int j = fa[x]; j != -1; j = fa[j]) {
for (int k = 0; k <= K; ++k) {
for (int l = 0; l <= k; ++l) { // not choose i
if (f[ls[x]][j][l] < INF && f[rs[x]][j][l] < INF)
f[x][j][k] = std::min(f[x][j][k], f[ls[x]][j][l] + f[rs[x]][j][k-l] + w[x] * (dep[x] - dep[j]));
}
for (int l = 0; l < k; ++l) { // choose i
if (f[ls[x]][x][l] < INF && f[rs[x]][j][k-l-1] < INF)
f[x][j][k] = std::min(f[x][j][k], f[ls[x]][x][l] + f[rs[x]][j][k-l-1]);
}
}
}
}
printf("%d\n", f[ls[1]][1][K]);
return 0;
}
[IOI2005]河流的更多相关文章
- 3354 [IOI2005]河流
题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄——名叫 ...
- 洛谷3354(IOI2005)河流——“承诺”
题目:https://www.luogu.org/problemnew/show/P3354 虽说是几个月前曾经讲过的题,但没有题解而自己(花了两个多小时)A了好高兴!!! 这是一个很好的套路:“承诺 ...
- dp式子100个……
1. 资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2. 资源问题2------01背包问题F[I,j]:=max(f[i- ...
- dp方程
1. 资源问题1 -----机器分配问题 F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2. 资源问题2 ------01背包问题 F[I,j]:=ma ...
- [LUOGU] P3354 [IOI2005]Riv 河流
题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫 ...
- BZOJ.1812.[IOI2005]Riv 河流(树形背包)
BZOJ 洛谷 这个数据范围..考虑暴力一些把各种信息都记下来.不妨直接令\(f[i][j][k][0/1]\)表示当前为点\(i\),离\(i\)最近的建了伐木场的\(i\)的祖先为\(j\),\( ...
- [IOI2005]River 河流
题目大意: 给定n个点的有根树,每条边有边权,每个点有点权w, 你要在k个点上建立伐木场,对于每个没有建伐木场的点x,令与它最近的祖先.有伐木场的点,为y,你需要支付dis(x,y)*w[x]的代价. ...
- 洛谷P3354 Riv河流 [IOI2005] 树型dp
正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...
- P3354 [IOI2005]Riv 河流
树形dp,设f[i][j][k]表示第i个点的子树中选择j个点作为伐木场,而且k是建了伐木场的最浅的i的祖先的情况下,最小的收益. 这种题还要练一下,咕咕 然后转移可以n4方做. // luogu-j ...
随机推荐
- HDU2612 Find a way (双广搜)
Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year ...
- Win10安装2 —— 版本的选择与下载
本文内容皆为作者原创,如需转载,请注明出处:https://www.cnblogs.com/xuexianqi/p/12368795.html 一:各个版本的区别 1.Windows10 Home(家 ...
- AcWing 1049. 大盗阿福
//f[i,j]表示所有走了i步,且当前位于状态j的所有走法 j=1表示选第i个 j=0表示不选 //如果j=0 那么表示不选第i个 那么就可以从f[i-1,0]和f[i-1,1]转移过来 //如果j ...
- @RendSection{"scripts",require:false}的作用
MVC视图中,Javascripts代码被放于下面的Razor代码中(@section Scripts{}). 好处:在视图进行JavaScript编程时,是一个很好的实践,在共享视图(_Layout ...
- Redis 数据库使用和搭建
1.redis中文网 http://www.redis.cn/documentation.html 2.数据类型介绍 http://redis.cn/topics/data-types-intro.h ...
- PHP实现微信公众号授权获取用户信息
class WxAuthModel extends BaseModel { var $appId = APPID; var $appSecret = APPSECRET; /*微信x小程序,获取微信o ...
- 在npm上如何发布自己的包
环境需要:node和npm 然后在本地建一个文件夹作为你要发布的模块 然后在这个文件夹下打开cmd 执行:npm init 按照提示写对应的,或者先不写也可以,最后y 这时候在mcrm这个文件夹下就出 ...
- Python并发学习
#Python并发 多任务 多进程 多线程 线程同步 #多任务处理 多任务处理:使得计算机可以同时处理多个任务 听歌的同时QQ聊天.办公.下载文件 实现方式:多进程.多线程 #程序和进程 程序:是一个 ...
- HTML link标签
<link> 标签定义文档与外部资源的关系. 最常见的用途是链接 样式表.CSS
- 三、linux环境的搭建1(oracle、ssh、jdk、mysql、samba、tomcat)
linux环境的搭建1(oracle.ssh.jdk.mysql.samba.tomcat) 网络配置 方案一 tip 1 使用ifconfig : ifconfig eth0 新ip 然后编辑/ ...