[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 ...
随机推荐
- POJ-3984-迷宫问题(bfs+记录路径)
定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...
- 洛谷P3381 MCMF【网络流】
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向 ...
- Wannafly Camp 2020 Day 2H 叁佰爱抠的序列 - 欧拉遍历
转化为完全图的欧拉遍历 如果 n 是奇数,则欧拉遍历长度为 \(n(n-1)/2\) 条边 如果 n 是偶数,则欧拉遍历长度为 \(n*n/2-1\) 条边 (即将(n-1)/2对点配对,剩下的一对当 ...
- [CF2B] The least round way - dp
给定由非负整数组成的n×n 的正方形矩阵,你需要寻找一条路径: 以左上角为起点 每次只能向右或向下走 以右下角为终点 并且,如果我们把沿路遇到的数进行相乘,积应当是最小"round" ...
- macOS 下安装tomcat
The Servlet 4.0 specification is out and Tomcat 9.0.x does support it. Time to dive into Tomcat 9. [ ...
- 打开一个网站,加载顺序是什么?先加载HTML然后JS然后CSS?还是什么?
HTML页面加载和解析流程 : 1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件. 2. 浏览器开始载入html代码,发现<head& ...
- django css文件导入,模板继承
今天写了一下模板继承 刚开始感觉还行,也挺简单的 当只有html的时候还是能继承到的,代码如下.首先在父html文件里加入 {% block content %} {% block extracss ...
- 逆战:微信小程序(一)
简介 小程序是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或者搜一下即可打开应用.也体现了"用完即走"的理念,用户不用关心是否安 ...
- Tomcat的使⽤
准备 1.官⽹地址:http://tomcat.apache.org下载. 2.解压文件,并放到指定路径,给该文件授权. chmod -R 755 3.启动和停止 进入到/Users/lucas/Do ...
- C语言sprintf函数的深入理解
由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出.这也导致sprintf比printf有用得多.所以本文着重介绍sprintf, ...