2021-2022 ICPC, NERC, Northern Eurasia Onsite (Unrated, Online Mirror, ICPC Rules, Teams Preferred) J. Job Lookup
题意
n个节点,n<=200,你需要构造这n个几点成为一棵树,并且这棵树的中序遍历为1-n;
你构造树的节点之间的最短路构成一个n×n的最短距离矩阵d;
同时给你n×n的权重矩阵c;最最小的Σdij*cij
思路
1. 显然,中序遍历,对于根节点来说,左边的序号小于根,右边的需要大于根
2. cij同化成对于i,j之间的最短路上,每条边增加cij,这样相当于对每条边考虑了
3. 下面就是常规套路了,区间dp,dp[l][r]代表范围l-r构成的子树,求和的最小值
枚举l,r的根节点k,显然需要dp[l][r]+=dp[l][k-1]+dp[k+1][r]
其次,需要分别统计红色,蓝色线的价值,即左子树内的几点到其他节点,以及右子树内的点到其他节点的价值,这相当与cij的子矩阵求和;
这个可以对cij进行前缀和预处理计算得出
代码
#include<bits/stdc++.h>
using namespace std;
long long a[205][205];
long long dp[205][205];
int ans[205];
int f[205][205];
int res(int l, int r) {
if (r < l)return 0;
int k = f[l][r];
ans[res(l, k - 1)] = k;
ans[res(k + 1, r)] = k;
return k;
}
long long clc(int l, int r, int ll, int rr) {
if (l > r || ll > rr)return 0;
return a[r][rr] - a[l - 1][rr] - a[r][ll - 1] + a[l - 1][ll - 1];
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
a[i][j] = (a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + a[i][j]);
}
}
// memset(dp, 0x3f, sizeof dp);
// for (int i = 1; i <= n; i++)for (int j = i; j <= n; j++)dp[i][j] = 1e18;
// for (int len = 1; len <= n; len++) {
// for (int l = 1; l + len - 1 <= n; l++) {
// int r = l + len - 1;
// for (int k = l; k <= r; k++) {
// long long v = dp[l][k - 1] + dp[k + 1][r] ;
// v += clc(1, l - 1, l, k - 1) + clc(l, k - 1, k, n);
// v += clc(1, k, k + 1, r) + clc(k + 1, r, r + 1, n);
// if (v < dp[l][r]) {
// dp[l][r] = v;
// f[l][r] = k;
// }
// }
// }
// }
memset(dp, 0x3f, sizeof dp);
for (int i = 0; i <= n; i++)dp[i][i] = 0, f[i][i] = i;
for (int len = 2; len <= n; len++) {
for (int l = 1; l + len - 1 <= n; l++) {
int r = l + len - 1;
for (int k = l; k <= r; k++) {
//long long v = ((l <= k - 1) ? dp[l][k - 1] : 0 )+ ((k + 1 <= r) ? dp[k + 1][r] : 0);
long long v = ((l < k - 1) ? dp[l][k - 1] : 0 )+ ((k + 1 < r) ? dp[k + 1][r] : 0);
// if (v != vv) {
// cout << l<< ' ' <<k<<' '<< r<<'\n';
// cout << dp[l][k - 1] << ' ' << dp[k + 1][r]<<'\n';
// }
v += clc(1, l - 1, l, k - 1) + clc(l, k - 1, k, n);
v += clc(1, k, k + 1, r) + clc(k + 1, r, r + 1, n);
if (v <= dp[l][r]) {
dp[l][r] = v;
f[l][r] = k;
}
}
}
}
// cout << dp[1][n] << '\n';
res(1, n);
for (int i = 1; i <= n; i++) {
cout << ans[i] << ' ';
}
return 0;
}
2021-2022 ICPC, NERC, Northern Eurasia Onsite (Unrated, Online Mirror, ICPC Rules, Teams Preferred) J. Job Lookup的更多相关文章
- 2019-2020 ICPC, NERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred)
这是一场三人组队赛来的,单人带电子模板不限时单挑试一下.按照难度排序. B - Balls of Buma 题意:玩祖玛,射入任意颜色的球一个,当某段长度变长了且长度变长后>=3则这段就会消除, ...
- 2018-2019 ICPC, NEERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred) Solution
A. Alice the Fan Solved. 题意: 两个人打网球,要求teamA 的得分与其他队伍拉开尽量大 输出合法的方案 思路: $dp[i][j][k][l] 表示 A 赢i局,其他队伍赢 ...
- 2019-2020 ICPC, NERC, Northern Eurasia Finals
A. Apprentice Learning Trajectory rdc乱编的做法 考虑贪心,每次会选择结束时间最早的. 设当前时间为 \(x\),那么可以区间有两类 a) \(l_i \leq x ...
- 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)
A. Find a Number 找到一个树,可以被d整除,且数字和为s 记忆化搜索 static class S{ int mod,s; String str; public S(int mod, ...
- 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) Solution
A. Find a Number Solved By 2017212212083 题意:$找一个最小的n使得n % d == 0 并且 n 的每一位数字加起来之和为s$ 思路: 定义一个二元组$< ...
- Codeforces1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)总结
第一次打ACM比赛,和yyf两个人一起搞事情 感觉被两个学长队暴打的好惨啊 然后我一直做傻子题,yyf一直在切神仙题 然后放一波题解(部分) A. Find a Number LINK 题目大意 给你 ...
- codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解
秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...
- 2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)
2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) easy: ACE ...
- Codeforces 1089E - Easy Chess - [DFS+特判][2018-2019 ICPC, NEERC, Northern Eurasia Finals Problem E]
题目链接:https://codeforces.com/contest/1089/problem/E Elma is learning chess figures. She learned that ...
随机推荐
- 自定义注解,利用AOP实现日志保存(数据库),代码全贴,复制就能用
前言 1,在一些特定的场景我们往往需要看一下接口的入参,特别是跨系统的接口调用(下发,推送),这个时候的接口入参就很重要,我们保存入参入库,如果出问题就可以马上定位是上游还是下游的问题(方便扯皮) 2 ...
- 【NOI P模拟赛】最短路(树形DP,树的直径)
题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...
- BI如何实现用户身份集成自定义安全程序开发
统一身份认证是整个 IT 架构的最基本的组成部分,而账号则是实现统一身份认证的基础.做好账号的规划和设计直接决定着企业整个信息系统建设的便利与难易程度,决定着系统能否足够敏捷和快速赋能,也决定了在数字 ...
- ipad好伴侣
https://museapp.com/ Muse是用于研究笔记,阅读,草图,屏幕截图和书签的空间画布.
- KingbaseES V8R6单实例外部备份故障案例
案例说明: 在KingbaseES V8R6单实例环境,配置外部备份服务器使用sys_backup.sh物理备份时,出现以下"WAL segment xxx was not archived ...
- Kingbase_FDW 使用介绍
与postgresql_fdw功能类似,KINGBASE_FDW 是一种外部访问接口,它可以被用来访问存储在外部的数据.想要使用fdw访问数据需要先确保:网络通,数据库访问配置(pg_hba,con ...
- 《网页设计基础——HTML常用标签》
网页设计基础--HTML常用标签 一.网页框架: 格式: <html> <head> <title>网页标题</title> <sty ...
- Java SE 16 record 类型说明与使用
Java SE 16 record 类型说明与使用 作者:Grey 原文地址: 博客园:Java SE 16 record 类型说明与使用 CSDN:Java SE 16 record 类型说明与使用 ...
- Kubernetes Node的隔离与恢复
在硬件升级.硬件维护等情况下,我们需要将某些Node进行隔离,脱离Kubernetes集群的调度范围.Kubernetes提供了一种机制,即可以将Node纳入调度范围,也可以将Node脱离调度范围. ...
- 使用yum方式安装的openresty参数
nginx version: openresty/1.19.3.1 built by gcc 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC) built with Ope ...