题目传送门

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_backtemplate<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 hzhkkfreopen("hkk.in", "r", stdin);
#endifinit();work();fclose(stdin), fclose(stdout);return 0;
}

转载于:https://www.cnblogs.com/hankeke/p/bzoj4244.html

bzoj4244 loj2878. 「JOISC 2014 Day2」邮戳拉力赛 括号序列+背包相关推荐

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

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

  2. LOJ #2878. 「JOISC 2014 Day2」邮戳拉力赛 动态规划+括号序列

    神题呀,我们观察到行走的方式一定是一条链+若干条环. 然后环可以看成是一对括号,所以来一个基于括号序的 DP. code: #include <bits/stdc++.h> #define ...

  3. 「JOISC 2014 Day1」巴士走读

    「JOISC 2014 Day1」巴士走读 题解部分: (如果不怎么喜欢看推导的人可以直接看下面的关键部分,在段尾会有标注(或者看完定义直接看代码)) 本题让我们求到达点n需要最晚何时到达点1,我们可 ...

  4. 「JOISC 2014 Day3」稻草人

    「JOISC 2014 Day3」稻草人 问题简述 解析 代码 问题简述 链接 https://loj.ac/problem/2880   给定 n n n个稻草人(横纵坐标是不大于 1 0 9 10 ...

  5. 「JOISC 2014 Day4」挂饰(背包DP)题解

    题目翻译 JOI 君有 n n n 个装在手机上的挂饰,编号为 1 - n 1 \ldots n 1-n. JOI 君可以将其中一些挂饰装在手机上. JOI 君的挂饰有一些与众不同--其中的一些挂饰附 ...

  6. 「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)

    「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi​:1−Ri​ 都能被救治成功的最小花费 两个治疗方案[Li,Ri], ...

  7. 【LOJ】#3030. 「JOISC 2019 Day1」考试

    LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...

  8. 【2018.10.1】「JOI 2014 Final」年轮蛋糕

    题面 一看到求"最小值的最大值"这种问题,就能想到二分了. 二分答案,然后我们要把一圈分成三块,使这三块的大小都$\geq mid$.做法是把环展开成2倍长度的链,先钦定一个起点, ...

  9. 【LOJ3272】「JOISC 2020 Day1」汉堡肉

    题目链接 点击打开链接 题目解法 考虑问题在一维上的形式,显然,我们会希望所选的最靠左侧的点尽量靠右. 因此,选择 min ⁡ { R i } \min\{R_i\} min{Ri​} 是不劣的,我们 ...

最新文章

  1. 香河php程序员_失控的香河最流行的四大职位
  2. Linux内核网络数据包发送(四)——Linux netdevice 子系统
  3. python3.3中print换行
  4. 解惑(三)----- 深入理解Python中的self参数和__init__(self)方法--通过类比Java语言
  5. C#通过Redis实现分布式锁
  6. 每日一题:leetcode959.由斜杠划分区域
  7. 探索性数据分析EDA及数据分析图表的选择
  8. 使用回调技术实现局部刷新
  9. linux 对象 调出r_[转载]linux系统下安装R包
  10. Mask R-CNN算法详解
  11. 百度地图根据经纬度计算距离php,百度地图两者经纬度距离计算
  12. 关于php 调用接口 微信云支付 HmacSha256 加密 request_content 生成 authen_code
  13. ​PHP现在不好找工作是真的吗?
  14. P2123皇后游戏+P1080国王游戏
  15. STP Security之BPDU Filter、BPDU Guard、Root Guard
  16. linux startx无效_LINUX startx命令-用来启动X Window
  17. php实现短信找回密码,thinkphp5怎么调用云片接口实现发送短信验证码找回密码功能...
  18. ppt密码忘了怎么解除,ppt权限密码怎么解开?
  19. nacos安装配置和单机部署教程
  20. [AlwaysOn] 创建SQL Server高可用性组T-SQL语法:SEEDING_MODE参数

热门文章

  1. WLAN无线局域网IEEE802.11协议二
  2. nginx处理cros跨域遇到的各种问题及解决方案,以及https配置和浏览器https不安全问题处理
  3. MATLAB异步风电机组,基于MATLAB的定速风电机组仿真
  4. Ubuntu使用Remastersys封装制作系统ISO镜像
  5. matlab 圆形轨迹,求助:轨迹线上画圆怎么画呢?
  6. 日语语法准备三:日语句子句型
  7. android问题解答
  8. ImageView实现画画板的功能
  9. 【企业架构设计实战】企业架构方法论
  10. 物联网环境下数据分析的应用