题目传送门

https://lydsy.com/JudgeOnline/problem.php?id=4244

https://loj.ac/problem/2878

题解

挺妙的一道题。

一开始一直往最短路上面想,然后怎么想发现都没有用。

然后就又开始自闭了。最后又去拜读题解了。(今天怎么读了两次题解啊,没救了没救了

一条合法的路线一定是从 \(0\) 到 \(n + 1\) 的链上套了无数个环。每一个邮戳台至少被一个环经过。

经过邮戳台的方式有 \(4\) 类:

  1. 上行 -> 邮戳台 -> 下行,费用为 \(u+e\)
  2. 下行 -> 邮戳台 -> 上行,费用为 \(d+v\)
  3. 上行 -> 邮戳台 -> 上行,费用为 \(u+v\)
  4. 下行 -> 邮戳台 -> 下行,费用为 \(d+e\)

其中第一类和第二类可以互相之间构成大环(跨越了两个邮戳台为大环)。

对于一个环,可以发现从路程上,第一类一定出现在第二类的前面。但是,从位置上,第二类一定出现在第一类的前面。于是,我们令 \((\) 表示第二类环,\()\) 表示第一类环。于是合法的路径是一个合法的括号序列。另外,对于第 \(4\) 类,因为是从下行台来的,所以之前必须有一个 \((\)。

然后,令 \(dp[i][j]\) 表示前 \(i\) 个位置,有 \(j\) 个不匹配的 \((\) 的最优解。直接转移就可以了。

注意第一二种情况可以多次使用,所以是一个完全背包。

最后加上从 \(0\) 到 \(n + 1\) 的链的长度。


代码如下,时间复杂度 \(O(n^2)\)。

#include<bits/stdc++.h>

#define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to)
#define dbg(...) fprintf(stderr, __VA_ARGS__)
#define File(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define fi first
#define se second
#define pb push_back template<typename A, typename B> inline char smax(A &a, const B &b) {return a < b ? a = b, 1 : 0;}
template<typename A, typename B> inline char smin(A &a, const B &b) {return b < a ? a = b, 1 : 0;} typedef long long ll; typedef unsigned long long ull; typedef std::pair<int, int> pii; template<typename I> inline void read(I &x) {
int f = 0, c;
while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;
x = c & 15;
while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);
f ? x = -x : 0;
} const int N = 3000 + 7;
const int INF = 0x3f3f3f3f; int n, t;
int u[N], v[N], d[N], e[N];
int dp[N][N]; inline void work() {
memset(dp, 0x3f, sizeof(dp)), dp[0][0] = 0;
for (int i = 1; i <= n; ++i) {
const int &u = ::u[i], &v = ::v[i], &d = ::d[i], &e = ::e[i];
for (int j = 0; j < n; ++j) smin(dp[i][j], dp[i - 1][j + 1] + u + e);
for (int j = 0; j <= n; ++j) smin(dp[i][j], dp[i - 1][j] + u + v);
for (int j = 1; j <= n; ++j) smin(dp[i][j], dp[i - 1][j - 1] + v + d);
for (int j = 1; j <= n; ++j) smin(dp[i][j], dp[i - 1][j] + d + e);
for (int j = 1; j <= n; ++j) smin(dp[i][j], dp[i][j - 1] + v + d);
for (int j = n - 1; ~j; --j) smin(dp[i][j], dp[i][j + 1] + u + e);
for (int j = 0; j <= n; ++j) if (dp[i][j] != INF) dp[i][j] += t * j * 2;
}
printf("%d\n", dp[n][0] + (n + 1) * t);
} inline void init() {
read(n), read(t);
for (int i = 1; i <= n; ++i) read(u[i]), read(v[i]), read(d[i]), read(e[i]);
} int main() {
#ifdef hzhkk
freopen("hkk.in", "r", stdin);
#endif
init();
work();
fclose(stdin), fclose(stdout);
return 0;
}

bzoj4244 & loj2878. 「JOISC 2014 Day2」邮戳拉力赛 括号序列+背包的更多相关文章

  1. [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]

    题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...

  2. LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS

    这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...

  3. LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA

    非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...

  4. 【LOJ】#3034. 「JOISC 2019 Day2」两道料理

    LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...

  5. 【LOJ】#3033. 「JOISC 2019 Day2」两个天线

    LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...

  6. 「JOISC 2014 Day1」巴士走读

    「JOISC 2014 Day1」巴士走读 将询问离线下来. 从终点出发到起点. 由于在每个点(除了终点)的时间被过来的边固定,因此如果一个点不被新的边更新,是不会发生变化的. 因此可以按照时间顺序, ...

  7. 「JOISC 2014 Day1」 历史研究

    「JOISC 2014 Day1」 历史研究 Solution 子任务2 暴力,用\(cnt\)记录每种权值出现次数. 子任务3 这不是一个尺取吗... 然后用multiset维护当前的区间,动态加, ...

  8. loj2880「JOISC 2014 Day3」稻草人

    题目链接:bzoj4237 ​ loj2880 考虑\(cdq\)分治,按\(x\)坐标排序,于是问题变成统计左下角在\([l,mid]\),右上角在\([mid+1,r]\)的矩形数量 我们先考虑固 ...

  9. LOJ#2882. 「JOISC 2014 Day4」两个人的星座(计算几何)

    题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一 ...

随机推荐

  1. php array_fill()函数 语法

    php array_fill()函数 语法 作用:用键值填充数组.大理石平台价格 语法:array_fill(index,number,value) 参数: 参数 描述 index 必需.被返回数组的 ...

  2. Apache服务器出现Forbidden 403错误提示的解决方法

    默认web目录/var/www/html 改成 /data/www出现403问题解决: vim /etc/apache2/apache2.conf <Directory /data/www/&g ...

  3. C++ Standard Template Library (STL) 高级容器

    更多 STL 数据结构请阅读 NOIp 数据结构专题总结(STL structure 章节) std::map Definition: template < class Key, // map: ...

  4. ReactNative的学习笔记

    一.安装nodejs 查看是否安装:npm -v 二.安装react-native命令工具 npm install -g react-native-cli 三.查看 react-native --he ...

  5. (转)cat > file << EOF 的用法

    转:https://www.cnblogs.com/chenjingchao/p/6259572.html cat> 文件名<<eof 用来创建文件在这之后输入任何东西 都是在 文件 ...

  6. P1063能量项链

    传送 这又是一道经典的区间DP题. 复习一下区间DP的做法. 三重循环,第一层枚举区间长度,第二层枚举起点,第三层枚举断点. 区间长度是从1到n-1(因为如果是从1到n的话,1+n≠n,所以是1到n- ...

  7. fread fwrite文本模式读写回车换行符 自动转换问题

    fread  会把\r\n(0d0a)替换为\nfwrite 会把\n替换为\r\n(0d0a),\r\n会变成\r\r\n(0d0d0a) 今天在写一个日志类,用于打印服务程序的信息. 我将每一个日 ...

  8. python如何判断1个列表中所有的数据都是相等的?

    方法一: 元素两两比较,如果有数据不同,则r的值变为false #!/usr/bin/python a=[22,22,22,22] b = len(a) r=True for i in range(b ...

  9. Linux Weblogic部署web项目(war包)

    第一步,启动并访问weblogic,进入登录页面 第二步,进入主页面,开始部署项目 第三步,上载项目war包 选择需要上载的本地war包 第四步,开始项目配置 继续下一步 选择红色标记的配置 第五步, ...

  10. -bash: ./hello.jar: 无法执行二进制文件

    在linux中直接调用java包产生的 解决:依赖多个包要用冒号分隔,而不是分号 正确:> java -cp ./lib/*:./hello.jar hello 错误:> java -cp ...