P3354 题解

题目传送门

一道很恶心的树形dp 但是我喜欢

题目大意:

一片海旁边有一条树状的河,入海口有一个大伐木场,每条河的分叉处都有村庄。建了伐木场的村庄可以直接处理木料,否则要往下游的伐木场运,运费为每吨每千米 \(1\) 分钱。现在要在一些村庄建 \(k\) 个伐木场,求建完之后最小的运输费用。

设计状态:

\[f(u,z,k,l):
\begin{cases}
u:以第i个点为根的子树 \\
z:离点i最近的伐木场的位置(祖先) \\
k:该子树被分配了k个伐木场 \\
l:0或1,表示是否在此节点建伐木场
\end{cases}
\]

转移

\[f_{u,z,k}=
\begin{cases}
f_{u,z,k,0}=\min\limits_{v\in son}f_{u,z,k-l,0}+f_{v,z,l,0}\\
f_{u,z,k,1}=\min\limits_{v\in son}f_{u,z,k-l,1}+f_{v,u,l,0}\ \ (此时u有伐木场,它的儿子们可以直接运往它)
\end{cases}
\]

\(l\) 为给一个儿子分配的 \(k\) 个伐木场

然后对是否建伐木场进行合并,即:

\[f_{u,z,k}=\min(f_{u,z,k,0}+w_u*(d_u-d_z)\ ,\ f_{u,z,k-1,1})
\]

初始状态

\[f_{u,z,j,0}=f_{u,z,j,0}+f_{v,z,0,0}\\
f_{u,z,j,1}=f_{u,z,j,1}+f_{v,u,0,0}
\]

代码:

#include <bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<=b;++i)
#define for_(i,a,b) for(int i=a;i>=b;--i)
#define ll long long
using namespace std;
const int N=110,inf=0x3f3f3f3f;
ll n,k,a,fm[N],c,w[N],d[N],v;
ll f[N][N][N][2];
vector<ll>s[N];
//fm:祖先,d:深度,s:儿子们
void dp(ll u){
fm[++c]=u;//把该点压入祖先们
int sz=s[u].size();
_for(i,0,sz-1){
int v=s[u][i];
d[v]+=d[u];
dp(v);
_for(i,1,c){//重点部分!!
for_(j,k,0){
//初始化
f[u][fm[i]][j][0]+=f[v][fm[i]][0][0];
f[u][fm[i]][j][1]+=f[v][u][0][0];
_for(l,0,j){
//转移
f[u][fm[i]][j][0]=min(f[u][fm[i]][j][0],f[u][fm[i]][j-l][0]+f[v][fm[i]][l][0]);
f[u][fm[i]][j][1]=min(f[u][fm[i]][j][1],f[u][fm[i]][j-l][1]+f[v][u][l][0]);
}
}
}
}_for(i,1,c){//合并
f[u][fm[i]][0][0]+=w[u]*(d[u]-d[fm[i]]);
_for(j,1,k)f[u][fm[i]][j][0]=min(f[u][fm[i]][j][0]+w[u]*(d[u]-d[fm[i]]),f[u][fm[i]][j-1][1]);
}
--c;//把该点弹出去
}
int main(){
scanf("%lld%lld",&n,&k);
_for(i,1,n){
scanf("%lld%lld%lld",&w[i],&a,&d[i]);
s[a].push_back(i);
}
dp(0);
printf("%lld\n",f[0][0][k][0]);
return 0;
}

「题解报告」P3354的更多相关文章

  1. 「题解报告」 P3167 [CQOI2014]通配符匹配

    「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...

  2. 「题解报告」P4577 [FJOI2018]领导集团问题

    题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...

  3. 「题解报告」P2154 虔诚的墓主人

    P2154 虔诚的墓主人 题解 原题传送门 题意 在 \(n\times m\) 一个方格上给你 \(w\) 个点,求方格里每个点正上下左右各选 \(k\) 个点的方案数. \(1 \le N, M ...

  4. 「题解报告」SP16185 Mining your own business

    题解 SP16185 Mining your own business 原题传送门 题意 给你一个无向图,求至少安装多少个太平井,才能使不管那个点封闭,其他点都可以与有太平井的点联通. 题解 其他题解 ...

  5. 「题解报告」Blocks

    P3503 Blocks 题解 原题传送门 思路 首先我们可以发现,若 \(a_l\) ~ \(a_r\) 的平均值大于等于 \(k\) ,则这个区间一定可以转化为都大于等于 \(k\) 的.我们就把 ...

  6. 「题解报告」CF1067A Array Without Local Maximums

    大佬们的题解都太深奥了,直接把转移方程放出来让其他大佬们感性理解,蒟蒻们很难理解,所以我就写了一篇让像我一样的蒟蒻能看懂的题解 原题传送门 动态规划三部曲:确定状态,转移方程,初始状态和答案. --神 ...

  7. 「题解报告」P7301 【[USACO21JAN] Spaced Out S】

    原题传送门 神奇的5分算法:直接输出样例. 20分算法 直接把每个点是否有牛的状态DFS一遍同时判断是否合法,时间复杂度约为\(O(2^{n^2})\)(因为有判断合法的剪枝所以会比这个低).而在前四 ...

  8. 「GXOI / GZOI2019」简要题解

    「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...

  9. 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)

    [题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...

随机推荐

  1. mysql数据恢复 根据旧备份的sql文件和当前data下的ibd文件恢复innodb引擎数据

    1.使用navicat fro mysql数据库工具进行恢复 2.将原有备份的sql文件导入数据库 3.新建一个空数据库 4将备份数据库的数据表复制到新建数据库(只复制表格式) 5.在命令行模式中 u ...

  2. 实测:云RDS MySQL性能是自建的1.6倍

    1. 摘要 基于之前写的「云厂商 RDS MySQL 怎么选」的文章,为了进一步了解各云厂商在RDS MySQL数据库性能上的差异,本文将对自建MySQL.阿里云.腾讯云.华为云和AWS 的 RDS ...

  3. 安装@parcel/transformer-image注意的问题

    安装前配置 npm config get cache 键入以上命令即可找到npm缓存路径,然后找到路径下的_libvips文件夹. 一般需要以下两个文件,这里以win环境为例.把文件放到_libvip ...

  4. Java Web servlet 详解

    执行原理 当服务器接收到客户端浏览器的访问时,会解析请求的URL路径,获取访问的Servlet的资源路径 查找web.xml文件,看是否有对应的<url-pattern>标签体内容 如果有 ...

  5. Spring Data JPA系列5:让IDEA自动帮你写JPA实体定义代码

    大家好,又见面了. 这是本系列的最后一篇文档啦,先来回顾下前面4篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你 ...

  6. 【万字长文】从零配置一个vue组件库

    简介 本文会从零开始配置一个monorepo类型的组件库,包括规范化配置.打包配置.组件库文档配置及开发一些提升效率的脚本等,monorepo 不熟悉的话这里一句话介绍一下,就是在一个git仓库里包含 ...

  7. 手写网站服务器~用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容

    写在前面的一些P话: 在公司网站开发中,我们往往借助于Flask.Django等网站开发框架去提高网站开发效率.那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么? 我们不止仅 ...

  8. SLF4J 日志门面

    目录 01.简单介绍 02.日志级别 03.入门案例 03.动态打印 04.异常打印 05.日志集成 06.集成 logback 07.集成 slf4j-nop 08.集成 log4j 09.集成 j ...

  9. 强化学习-学习笔记7 | Sarsa算法原理与推导

    Sarsa算法 是 TD算法的一种,之前没有严谨推导过 TD 算法,这一篇就来从数学的角度推导一下 Sarsa 算法.注意,这部分属于 TD算法的延申. 7. Sarsa算法 7.1 推导 TD ta ...

  10. 工作流引擎在vivo营销自动化中的应用实践 | 引擎篇03

    作者:vivo 互联网服务器团队- Cheng Wangrong 本文是<vivo营销自动化技术解密>的第4篇文章,分析了在营销自动化业务引入工作流技术的背景和工作流引擎的介绍,同时介绍了 ...