Description

Luogu3354

Solution

一道树形dp的题。

首先考虑转移,很简单,就是这个点做不做伐木场。为了方便转移,我们定义状态为\(f_{i,j,k}\)表示点\(i\)及其兄弟的子树中,选了\(k\)个伐木场,且\(j\)是点\(i\)的父亲中距离点\(i\)最近的那个伐木场,这时的总花费。

转移就比较好写了:

\[f_{i,j,k} = min\{ f_{son_i, j, l} + f_{bro_i, j, k-l} + w_i * dis_{i, j} \} \mbox{(不选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]河流的更多相关文章

  1. 3354 [IOI2005]河流

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

  2. 洛谷3354(IOI2005)河流——“承诺”

    题目:https://www.luogu.org/problemnew/show/P3354 虽说是几个月前曾经讲过的题,但没有题解而自己(花了两个多小时)A了好高兴!!! 这是一个很好的套路:“承诺 ...

  3. 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- ...

  4. dp方程

    1.        资源问题1 -----机器分配问题 F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2.        资源问题2 ------01背包问题   F[I,j]:=ma ...

  5. [LUOGU] P3354 [IOI2005]Riv 河流

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

  6. BZOJ.1812.[IOI2005]Riv 河流(树形背包)

    BZOJ 洛谷 这个数据范围..考虑暴力一些把各种信息都记下来.不妨直接令\(f[i][j][k][0/1]\)表示当前为点\(i\),离\(i\)最近的建了伐木场的\(i\)的祖先为\(j\),\( ...

  7. [IOI2005]River 河流

    题目大意: 给定n个点的有根树,每条边有边权,每个点有点权w, 你要在k个点上建立伐木场,对于每个没有建伐木场的点x,令与它最近的祖先.有伐木场的点,为y,你需要支付dis(x,y)*w[x]的代价. ...

  8. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

  9. P3354 [IOI2005]Riv 河流

    树形dp,设f[i][j][k]表示第i个点的子树中选择j个点作为伐木场,而且k是建了伐木场的最浅的i的祖先的情况下,最小的收益. 这种题还要练一下,咕咕 然后转移可以n4方做. // luogu-j ...

随机推荐

  1. HDU2612 Find a way (双广搜)

    Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year ...

  2. Win10安装2 —— 版本的选择与下载

    本文内容皆为作者原创,如需转载,请注明出处:https://www.cnblogs.com/xuexianqi/p/12368795.html 一:各个版本的区别 1.Windows10 Home(家 ...

  3. AcWing 1049. 大盗阿福

    //f[i,j]表示所有走了i步,且当前位于状态j的所有走法 j=1表示选第i个 j=0表示不选 //如果j=0 那么表示不选第i个 那么就可以从f[i-1,0]和f[i-1,1]转移过来 //如果j ...

  4. @RendSection{"scripts",require:false}的作用

    MVC视图中,Javascripts代码被放于下面的Razor代码中(@section Scripts{}). 好处:在视图进行JavaScript编程时,是一个很好的实践,在共享视图(_Layout ...

  5. Redis 数据库使用和搭建

    1.redis中文网 http://www.redis.cn/documentation.html 2.数据类型介绍 http://redis.cn/topics/data-types-intro.h ...

  6. PHP实现微信公众号授权获取用户信息

    class WxAuthModel extends BaseModel { var $appId = APPID; var $appSecret = APPSECRET; /*微信x小程序,获取微信o ...

  7. 在npm上如何发布自己的包

    环境需要:node和npm 然后在本地建一个文件夹作为你要发布的模块 然后在这个文件夹下打开cmd 执行:npm init 按照提示写对应的,或者先不写也可以,最后y 这时候在mcrm这个文件夹下就出 ...

  8. Python并发学习

    #Python并发 多任务 多进程 多线程 线程同步 #多任务处理 多任务处理:使得计算机可以同时处理多个任务 听歌的同时QQ聊天.办公.下载文件 实现方式:多进程.多线程 #程序和进程 程序:是一个 ...

  9. HTML link标签

    <link> 标签定义文档与外部资源的关系. 最常见的用途是链接 样式表.CSS

  10. 三、linux环境的搭建1(oracle、ssh、jdk、mysql、samba、tomcat)

    linux环境的搭建1(oracle.ssh.jdk.mysql.samba.tomcat)   网络配置 方案一 tip 1 使用ifconfig : ifconfig eth0 新ip 然后编辑/ ...