题目传送门

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. 2017 ICPC HongKong B:Black and White(扫描线+线段树)

    题目描述 Consider a square map with N × N cells. We indicate the coordinate of a cell by (i, j), where 1 ...

  2. JS中的继承(原型链、构造函数、组合式、class类)

    1.继承 应注意区分继承和实例化,实例化是生成一个对象,这个对象具有构造函数的属性和方法:继承指的应该是利用父类生成一个新的子类构造函数,通过这个子类构造函数实例化的对象,具有子类的属性和方法,同时也 ...

  3. 【HDOJ6627】equation(模拟)

    题意:给定n,整数序列a和b,整数C,求所有成立的x n<=1e5,1<=a[i]<=1e3,-1e3<=b[i]<=1e3,1<=C<=1e9 思路: 大概 ...

  4. 学习日记7、mvc +easyui datagrid excel上传

    1.首先获取datagrid所有行的数据 var rows = $("#List").datagrid("getRows"); 2.进行数据转换转化成JSON格 ...

  5. java并发编程如何预防死锁

    在java并发编程领域已经有技术大咖总结出了发生死锁的条件,只有四个条件都发生时才会出现死锁: 1.互斥,共享资源X和Y只能被一个线程占用 2.占有且等待,线程T1已经取得共享资源X,在等待共享资源Y ...

  6. windows连接ubuntu服务器方式

    如图,打开cmd, 输入 ssh imkow@www.dorian.vip 参数解析: ssh:secure shell的缩写 imknow  是用户名 www.dorian.vip 是域名,没有域名 ...

  7. hypermesh生成MNF柔性体

    软件HyperworksX 2019: 该版本默认的是optistruct模板 1.导入几何→分网→材料定义(注意单位,建议统一mks单位制)→定义单元属性→创建刚性单元: 2.创建load coll ...

  8. python 数字系列-复数的数学运算

    复数的数学运算 问题 你写的最新的网络认证方案代码遇到了一个难题,并且你唯一的解决办法就是使用复数空间. 再或者是你仅仅需要使用复数来执行一些计算操作. 解决方案 复数可以用使用函数 complex( ...

  9. 003-notepad++插件

    1.下载 https://github.com/bruderstein/nppPluginManager/releases 下载最新的PluginManager_vXXXX_UNI.zip 解压,将里 ...

  10. UML 类图快速入门

    UML 图形 官方定义 UML 类图(Class Diagram) UML 时序图(Sequence Diagram) 领域 UML 类图和实现 UML 类图 领域 UML 类图 实现 UML 类图 ...