博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI 2018]道路
阅读量:5174 次
发布时间:2019-06-13

本文共 1572 字,大约阅读时间需要 5 分钟。

Description

给出一棵含有 \(n\) 个叶子节点的二叉树,对于每个非叶子节点的节点,其与左儿子相连的边为公路,其与右儿子相连的边为铁路。对于每个节点,选择一条与其儿子相连的铁路或公路。对于每个叶子节点 \(u\) ,含有三个参数 \(a,b,c\) ,记 \(u\) 到根节点一共需要经过 \(x\) 条未选择的公路与 \(y\) 条未选择的铁路,其代价为

\[c_u \cdot (a_u + x) \cdot (b_u + y)\]

求最小的总代价和。

\(n \le 20000\)\(1 \le a_i,b_i \le 60\)\(1 \le c_i \le 10^9\) ,二叉树深度不超过 \(40\)

Solution

传说中的普及 \(dp\)

\(f_{i,j,k}\)\(i\) 这个节点到根节点路径上一共需要经过 \(j\) 条未选择的公路与 \(k\) 条未选择的铁路,其子树中最小的代价和。

答案就是 \(f_{1,0,0}\)

转移就是考虑当前节点选择铁路还是选择公路。

时间复杂度和空间复杂度为 \(O(40^2n)\)

Code

#include 
#define ll long long#define F(o, i, j) (1ll*c[o]*(i+a[o])*(j+b[o]))using namespace std;const int N = 20000+5;int n, a[N], b[N], c[N], ls[N], rs[N];ll f[N][41][41];void dfs(int o, int dep) { if (o < 0) return; int l = ls[o], r = rs[o]; dfs(l, dep+1), dfs(r, dep+1); for (int i = 0; i <= dep; i++) for (int j = 0; j <= dep; j++) { if (l < 0 && r < 0) f[o][i][j] = min(F(-l, i+1, j)+F(-r, i, j), F(-l, i, j)+F(-r, i, j+1)); else if (l < 0) f[o][i][j] = min(F(-l, i+1, j)+f[r][i][j], F(-l, i, j)+f[r][i][j+1]); else if (r < 0) f[o][i][j] = min(f[l][i+1][j]+F(-r, i, j), f[l][i][j]+F(-r, i, j+1)); else f[o][i][j] = min(f[l][i+1][j]+f[r][i][j], f[l][i][j]+f[r][i][j+1]); }}void work() { scanf("%d", &n); memset(f, 127/3, sizeof(f)); for (int i = 1; i < n; i++) scanf("%d%d", &ls[i], &rs[i]); for (int i = 1; i <= n; i++) scanf("%d%d%d", &a[i], &b[i], &c[i]); dfs(1, 0); printf("%lld\n", f[1][0][0]);}int main() {work(); return 0; }

转载于:https://www.cnblogs.com/NaVi-Awson/p/8904122.html

你可能感兴趣的文章
Leetcode617.Merge Two Binary Trees合并二叉树
查看>>
jquery选择div下的ul下的li下的a
查看>>
lock的两种方式
查看>>
YCSB-mapkeeper
查看>>
Python 经典正则表达式语法实例
查看>>
oracle函数 MAX([distinct|all]x)
查看>>
LINUX对于未安装的软件包的查看
查看>>
判断iOS设备是否越狱
查看>>
团队博客
查看>>
hdoj--1010<dfs+奇偶剪枝>
查看>>
在Android中如何获取视频的第一帧图片并显示在一个ImageView中
查看>>
深入理解CNI
查看>>
Pie(二分法)
查看>>
为单元测试等非WebBase的项目伪造一个HttpContext , Session 和HttpHeader
查看>>
算法设计之最长公共子序列(LCS)问题
查看>>
javascript面向对象之Javascript 继承
查看>>
常用的Oracle数据库语句 (待更新完毕)
查看>>
[转] TreeList 当前节点图标和背景色设置
查看>>
Python日期时间函数处理
查看>>
vs2008快捷键极其技巧
查看>>