参考题解

题意:
有一个 2 2 2 行, m m m 列的方格,初始在 ( 1 , 1 ) (1,1) (1,1),每个格子有一个开放时间,开放时间后才能到达,每个格子只能被到达一次,你可以任意选择上下左右四个方向,问最少需要多长时间可以将所有格子都到达一遍,初始在 ( 1 , 1 ) (1,1) (1,1) 被视为已到达。

数据范围:
每个格子的开放时间: 0 ≤ a [ i ] [ j ] ≤ 1 0 9 0\leq a[i][j]\leq 10^9 0≤a[i][j]≤109
1 ≤ m ≤ 2 × 1 0 5 1\leq m\leq 2\times 10^5 1≤m≤2×105

题解:
模拟下发现,如果连续向右两次,那么只能走 U U U 字形。

d p [ i ] [ j ] dp[i][j] dp[i][j] 表示从 ( i , j ) (i,j) (i,j) 点出发,到达 d p [ i ⊕ 1 ] [ j ] dp[i\oplus 1][j] dp[i⊕1][j] 的最迟出发时间,这里的最迟出发时间是指从 ( i , j ) (i,j) (i,j) 这个点出发,走 U U U 字形路时,中途不会因为格子未开放而等待,即我们将所有的等待时间都留在了 ( i , j ) (i,j) (i,j) 这个点,这与到达某个点前等待其开放是等价的。

从后向前枚举 j j j,
d p [ i ] [ j ] = m a x { a [ i ] [ j ] + 1 , d p [ i ] [ j + 1 ] − 1 , a [ i ⊕ 1 ] [ j ] − 2 × ( m − j − 1 ) } dp[i][j] = max\{a[i][j] + 1, dp[i][j + 1] - 1, a[i\oplus 1][j] - 2 \times (m - j - 1)\} dp[i][j]=max{a[i][j]+1,dp[i][j+1]−1,a[i⊕1][j]−2×(m−j−1)}

  • a [ i ] [ j ] + 1 a[i][j] + 1 a[i][j]+1,表示从 ( i , j ) (i,j) (i,j) 出发至少要等待该点开放,开放后到达该点的时间最早是 a [ i ] [ j ] + 1 a[i][j]+1 a[i][j]+1
  • d p [ i ] [ j + 1 ] − 1 dp[i][j + 1] - 1 dp[i][j+1]−1,表示从 ( i , j ) (i,j) (i,j) 到 ( i , j + 1 ) (i,j+1) (i,j+1) 的最迟出发时间为 ( i , j + 1 ) (i,j+1) (i,j+1) 到 ( i ⊕ 1 , j + 1 ) (i\oplus1,j+1) (i⊕1,j+1)的最迟出发时间减 1 1 1,减的 1 1 1 为从 ( i , j ) (i,j) (i,j) 到 ( i , j + 1 ) (i,j+1) (i,j+1) 这一步
  • d p [ i ⊕ 1 ] [ j ] − 2 × ( m − j − 1 ) dp[i\oplus1][j]-2\times(m-j-1) dp[i⊕1][j]−2×(m−j−1),等价于 ( a [ i ⊕ 1 ] [ j ] + 1 ) ① − ( 2 × ( m − j − 1 ) + 1 ) ② (a[i\oplus1][j]+1)_{①} -(2\times(m-j-1)+1)_{②} (a[i⊕1][j]+1)①​−(2×(m−j−1)+1)②​
    ①:到达 ( i ⊕ 1 , j ) (i\oplus 1,j) (i⊕1,j) 的最早时间
    ②:从 ( i , j ) (i,j) (i,j) 到 ( i ⊕ 1 , j ) (i\oplus 1,j) (i⊕1,j) 无需等待开放的最短时间

满足以上三点,才能确定从 ( i , j ) (i,j) (i,j) 到 ( i ⊕ 1 , j ) (i\oplus 1,j) (i⊕1,j) 的最迟出发时间。

事实上,这块类似AOE网中的关键路径,在这里将所有的等待时间都放在了 U U U 字形路线的出发点,同时并不会影响答案。

之后,先蛇皮走位,然后根据蛇皮走位后的 U U U 字形路线出发点确定实际 从 ( i , j ) (i,j) (i,j) 到 ( i ⊕ 1 , j ) (i\oplus 1,j) (i⊕1,j) 的最迟出发时间,这里是因为蛇皮走位也会影响 U U U 字形路线出发点的最迟出发时间,而上述的 d p dp dp 并不考虑蛇皮走位。

代码:

#include <bits/stdc++.h>
using namespace std;typedef long long ll;const int M = 200010;
const int INF = 0x3f3f3f3f;
int a[2][M];
int dp[2][M];
int n = 2, m;void solve() {scanf("%d", &m);for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j)scanf("%d", &a[i][j]);a[0][0] = -1;dp[0][m] = dp[1][m] = 0;for (int j = m - 1; j >= 0; --j)for (int i = 0; i < n; ++i) dp[i][j] = max({a[i][j] + 1, dp[i][j + 1] - 1, a[i ^ 1][j] - 2 * (m - j - 1)});int ans = INF;int already = 0;int i = 0, j = 0;for (int ca = 0; ca < m; ++ca) {ans = min(ans, max(already, dp[i][j]) + 2 * (m - ca) - 1);i ^= 1;already = max(already, a[i][j]) + 1;j += 1;if (j == m) {ans = min(ans, already);} else {already = max(already, a[i][j]) + 1;}}printf("%d\n", ans);
}int main()
{int T = 1;scanf("%d", &T);for (int i = 1; i <= T; ++i) {solve();}return 0;
}

【细节很多的dp】Educational Codeforces Round 133 (Rated for Div. 2) C. Robot in a Hallway相关推荐

  1. Educational Codeforces Round 133 (Rated for Div. 2) 题解 CD

    D: 这是一道好dp(对我来说) 我做的时候有想过正解那个方式当考虑到可能有重复就没有深入思考了 假设dp[i][j]代表第i次j的方案数 此时我们可以发现dp[i][j]=sum(dp[i-1][j ...

  2. Educational Codeforces Round 133 (Rated for Div. 2)(CD题解)

    Educational Codeforces Round 133 (Rated for Div. 2)CD题解 过AB补CD C. Robot in a Hallway 题意 题意:现有 2∗m 的方 ...

  3. C. Robot in a Hallway Educational Codeforces Round 133 (Rated for Div. 2)dp

    dp问题 There is a grid, consisting of 22 rows and mm columns. The rows are numbered from 11 to 22 from ...

  4. Educational Codeforces Round 133 (Rated for Div. 2) D题

    题目链接:Problem - D - Codeforces 一道非常经典的完全背包求方案数题: 首先先写好我们的状态转移方程,那什么代表体积,什么代表物品数目呢: 其实很清晰k, k + 1 ... ...

  5. Educational Codeforces Round 133 (Rated for Div. 2)

    本来也没啥的这A题也不改花多久时间 大家都在用暴力我来给出O(1)的解法 确实不容易写出这的时候已经崩溃了放上一张图片共参考 说我菜吧确实- 呃..... 再讲解也下吧: 题目就是在一个数轴上有一个小 ...

  6. Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp

    传送门 文章目录 题意: 思路: 题意: 给你一个串,只包含前kkk个字母和???,定义fif_ifi​表示第iii个字母在串中出现的最长连续长度,你现在需要将???替换为前kkk个字母,使得mini ...

  7. Educational Codeforces Round 73 (Rated for Div. 2) Make The Fence Great Again dp + 结论

    传送门 文章目录 题意: 思路: 题意: 思路: 首先证明一个结论:一个数最多被加两次. 首先假设a[i]=a[i−1]a[i]=a[i-1]a[i]=a[i−1]或a[i]=a[i+1]a[i]=a ...

  8. Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs

    传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici​个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...

  9. Educational Codeforces Round 73 (Rated for Div. 2) F. Choose a Square 线段树 + 二维转一维

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点(xi,yi)(x_i,y_i)(xi​,yi​),每个点有个价值cic_ici​,现在你可以框一个正方形,要求左下角和右上角的坐标(x,y)( ...

最新文章

  1. 真香!Vision Transformer 快速实现 Mnist 识别
  2. 【pytorch】拟合sin函数
  3. npm常用命令:init、install、uninstall、help
  4. 使用七牛云对网站进行加速基本配置
  5. C语言入坑指南-数组之谜
  6. 从零开始学PowerShell(6)获取对象信息
  7. jquery出现“为了有利于保护安全性,IE已限制此网页运行可以访问计算机的脚本或 ActiveX 控件。请单击这里获取选项...”的解决办法
  8. 一些常见的项目行为状态[转]
  9. 钢铁雄心II(HOI2)作弊码合辑
  10. JavaScript判断数组中是否包含某个值?
  11. 课得在线:Java程序员未来前景?大龄程序员出路在何方
  12. 推荐几个后台管理界面
  13. ACM------吃在工大(合工大OJ 1359)
  14. 希望从今往后,是日积月累的努力,而不是由于心血来潮而半途而废
  15. 自平衡自行车本质就是一个惯性飞轮,本质就是一样的!!!
  16. JavaScript学习笔记(三)---事件、正则表达式、ES6、运动
  17. 颜色的前世今生15·CMYK系统(原色的选择)
  18. Exiting on user cancel解决
  19. 一篇文章搞定交换机的三种端口类型
  20. 中国各朝代统治时间列表

热门文章

  1. Windows 7 RTM 试用
  2. linux安装node(含npm命令) 并配置淘宝镜像源
  3. Python 爬取高清桌面壁纸
  4. Android设置悬浮窗按钮,图片有多余的白色背景
  5. 如何使用MFC编写自定义UI界面【附高仿QQ 2014登陆界面范例程序】
  6. 无锁CAS/无锁队列
  7. Java 访问权限 内部类总结
  8. Activiti-businessRuleTask(业务规则任务)
  9. bug生命周期以及管理
  10. 东方财富自定义换手率副图指标(QDHSL)