P2339 [USACO04OPEN]Turning in Homework G 笔记

P2339 USACO04OPENTurning in Homework G链接在此

本题使用的大致思想有贪心动态规划

使用的模型是区间DP。更加细致地,是在区间两端的DP。

贪心:

首先应当明确的是,我们的路线应该是酱紫的:


原因:
1.我们不可能一直朝着一个方向走,走走停停,那样显然是不优的。
2.那为什么我们的圈子越兜越小了呢?(想一想,为什么?)1

继续,我们考虑,∃i,js.t.xi≤xj∧Ti≤Tj\exist ~i,j ~~s.t.~~x_i \le x_j \land T_i \le T_j∃ i,j  s.t.  xi​≤xj​∧Ti​≤Tj​这样的两间教室。通俗点讲,就是iii教室在jjj教室前面,而且iii教室先下课。那么我们就可以在前往jjj教室的路上顺便前往iii教室。如果Ti≥TjT_i \ge T_jTi​≥Tj​,那么我们可以在从jjj返回的路上顺便前往iii教室。

所以我们应当将每件教室按照位置进行排序(贪心的体现)。

动态规划之区间DP

变量的选取

既然我们兜的圈子是精心规划过的,那么就应当以圈子的范围为突破口。也就是说,将圈子的范围作为转移方程的变量,以此来进行转移。我们先将圈子的左右端点记下来,记作lll和rrr。之后,我们将圈子更严谨地成为“区间”。

不过,只有范围还是很粗糙的,我们要进一步精致化。

考虑:我们现在处在一个区间的端点上,接下来要如何走?等等,突然发现似乎我们并不清楚现在究竟处在这个区间的哪一个端点上。因为处在不同的端点就有不同的转向策略,所以,必要地,我们应当把现在所处区间的端点也作为一个变量。区间只有两个端点,那么我们记000作为左端点,记111作为右端点。

动态转移方程

为了简洁和易于理解,将两点i,ji,ji,j之间的距离记作dis(i,j)dis(i,j)dis(i,j),而在具体实现中我们应使用∣xi−xj∣|x_i-x_j|∣xi​−xj​∣,即abs(a[i].x-a[j].x)。请读者再次阅读题目明确各个变量的含义

接下来就是写出动态转移方程的时候了:

我们设f[l][r][0]f[l][r][0]f[l][r][0]表示当前处在区间[l,r][l,r][l,r]的左端点时2,已经花费的最小时间。

一、考虑当我们处在区间[l,r][l,r][l,r]的左端点上时,上一步可能是从哪里转移过来的:
  1)如果是第l−1l-1l−1个教室,我们花费的时间至少是f[l−1][r][0]+dis(l−1,l)f[l-1][r][0]+dis(l-1,l)f[l−1][r][0]+dis(l−1,l),(已经花费的时间+将花费的时间)。又因为受到了时间TTT的限制,故我们这个步骤的结果就是max⁡(f[l−1][r][0]+dis(l−1,l),Tl)\max(f[l-1][r][0]+dis(l-1,l),T_{l})max(f[l−1][r][0]+dis(l−1,l),Tl​)。
  2)如果是第r+1r+1r+1个教室,我们花费是时间至少是f[l][r+1][1]+dis(l,r+1)f[l][r+1][1]+dis(l,r+1)f[l][r+1][1]+dis(l,r+1),同样受到时间限制,这个步骤的结果是max⁡(f[l][r+1][1]+dis(l,r+1),Tl)\max(f[l][r+1][1]+dis(l,r+1),T_{l})max(f[l][r+1][1]+dis(l,r+1),Tl​)。
  我们要从这两种情况中选择时间更小的那个,所以:
f[l][r][0]=min⁡{max⁡(f[l−1][r][0]+dis(l−1,l),Tl)max⁡(f[l][r+1][1]+dis(l,r+1),Tl)}f[l][r][0]=\min \begin{Bmatrix} \max(f[l-1][r][0]+dis(l-1,l),T_{l}) \\ \max(f[l][r+1][1]+dis(l,r+1),T_{l}) \end{Bmatrix} f[l][r][0]=min{max(f[l−1][r][0]+dis(l−1,l),Tl​)max(f[l][r+1][1]+dis(l,r+1),Tl​)​}
二、考虑当我们处在区间[l,r][l,r][l,r]的右端点上时,上一步可能是从哪个教室转移来:
  1)如果是第l−1l-1l−1个教室,结果就是max⁡(f[l−1][r][0]+dis(l−1,r),Tr)\max(f[l-1][r][0]+dis(l-1,r),T_{r})max(f[l−1][r][0]+dis(l−1,r),Tr​)。
  2)如果是第r+1r+1r+1个教室,结果就是max⁡(f[l][r+1][1]+dis(r,r+1),Tr)\max(f[l][r+1][1]+dis(r,r+1),T_{r})max(f[l][r+1][1]+dis(r,r+1),Tr​)。
  结合这两种情况,可得:
f[l][r][1]=min⁡{max⁡(f[l−1][r][0]+dis(l−1,r),Tr)max⁡(f[l][r+1][1]+dis(r,r+1),Tr)}f[l][r][1]=\min \begin{Bmatrix} \max(f[l-1][r][0]+dis(l-1,r),T_{r}) \\ \max(f[l][r+1][1]+dis(r,r+1),T_{r}) \end{Bmatrix} f[l][r][1]=min{max(f[l−1][r][0]+dis(l−1,r),Tr​)max(f[l][r+1][1]+dis(r,r+1),Tr​)​}

综上所述,我们可以得到:
f[l][r][0]=min⁡{max⁡(f[l−1][r][0]+dis(l−1,l),Tl)max⁡(f[l][r+1][1]+dis(l,r+1),Tl)}f[l][r][1]=min⁡{max⁡(f[l−1][r][0]+dis(l−1,r),Tr)max⁡(f[l][r+1][1]+dis(r,r+1),Tr)}f[l][r][0]=\min \begin{Bmatrix} \max(f[l-1][r][0]+dis(l-1,l),T_{l}) \\ \max(f[l][r+1][1]+dis(l,r+1),T_{l}) \end{Bmatrix}\\ f[l][r][1]=\min \begin{Bmatrix} \max(f[l-1][r][0]+dis(l-1,r),T_{r}) \\ \max(f[l][r+1][1]+dis(r,r+1),T_{r}) \end{Bmatrix} f[l][r][0]=min{max(f[l−1][r][0]+dis(l−1,l),Tl​)max(f[l][r+1][1]+dis(l,r+1),Tl​)​}f[l][r][1]=min{max(f[l−1][r][0]+dis(l−1,r),Tr​)max(f[l][r+1][1]+dis(r,r+1),Tr​)​}

然后照着抄,实现在代码上就OK了~

你以为这就OK了?不!还有很多细节:

实现的细节

初始化fff数组

fff数组的初始化应该赋值为∞\infty∞,但是还应当把f[1][n][0]f[1][n][0]f[1][n][0]和f[1][n][1]f[1][n][1]f[1][n][1]用转移方程来预处理出来。

答案的选择

我们在做完这些步骤之后,得到的是最小的区间[i,i][i,i][i,i],而区间f[i][i][0/1]f[i][i][0/1]f[i][i][0/1]还要加上dis(i,d)dis(i,d)dis(i,d)才是最终答案。我们还要再O(n)O(n)O(n)跑一遍得出最小值。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>#define max std::max
#define min std::mintypedef struct Res
{int x, t;bool operator < (const Res &b) const{if(x<b.x)return 1;return 0;}
}Res;
Res a[1005];
int dp[1005][1005][2];
int main(void)
{int n, len, E, i, j, ans;scanf("%d%d%d", &n, &len, &E);for(i=1;i<=n;i++)scanf("%d%d", &a[i].x, &a[i].t);sort(a+1, a+n+1);memset(dp, 62, sizeof(dp));dp[1][n][0] = max(a[1].x, a[1].t);dp[1][n][1] = max(a[n].x, a[n].t);for(i=1;i<=n;i++){for(j=n;j>=1;j--){if(i==1 && j==n) continue;dp[i][j][0]=min(max(dp[i-1][j][0]+a[i].x-a[i-1].x,a[i].t),max(dp[i][j+1][1]+a[j+1].x-a[i].x, a[i].t));dp[i][j][1]=min(max(dp[i-1][j][0]+a[j].x-a[i-1].x,a[j].t),max(dp[i][j+1][1]+a[j+1].x-a[j].x,a[j].t));}}ans = 2147483647;for(i=1;i<=n;i++)ans = min(ans, min(dp[i][i][1], dp[i][i][0])+abs(E-s[i].x));printf("%d\n", ans);return 0;
}

  1. 反证法:
    分两种情况:
    1)假设我们的圈子大小一直不变,在圈子边界上就会出现时间的浪费,不优。
    2)假设我们的圈子越兜越大,在圈子中心就会出现越来越多的空闲教室,也就是说,我们花费的大量不必要的时间在路上。
    更加感性地,我们这样考虑:圈子越来越小,意味着我们尽可能地将路上花费的时间减小了,是更优秀的。 ↩︎

  2. 此时除了这个区间以外的所有教室的作业都已经收好了,不用去理会。注意,lll和rrr是已经收好作业的。 ↩︎

P2339 [USACO04OPEN]Turning in Homework G 笔记/题解相关推荐

  1. bzoj 3379: [Usaco2004 Open]Turning in Homework 交作业(区间DP)

    3379: [Usaco2004 Open]Turning in Homework 交作业 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 50  S ...

  2. 西南民族大学第十届校赛(同步赛) 个人笔记 题解

    题目链接:https://ac.nowcoder.com/acm/contest/322#question 先来一波官方题解 作者:兔子韩 链接:https://ac.nowcoder.com/dis ...

  3. 洛谷 P4233 射命丸文的笔记 题解

    题目传送门 题目大意: 求 nnn 个点的强连通竞赛图中的哈密顿回路的期望个数. 题解 答案需要求期望个数,那么只需要求出总的哈密顿回路个数除以强联通竞赛图个数即可. 设 s[i]s[i]s[i] 表 ...

  4. 【算法笔记题解】《算法笔记知识点记录》第三章——入门模拟1——简单模拟

    如果喜欢大家还希望给个收藏点赞呀0.0 相关知识点大家没基础的还是要看一下的,链接: <算法笔记知识点记录>第三章--入门模拟 由于放原题的话文章实在太长,所以题多的话我只放思路和题解,大 ...

  5. P2858 [USACO06FEB]Treats for the Cows G/S 题解

    emmmmmm,第二篇文章,多多写文章,好好掌握知识! 前言 原本在educoder上刷题,刷到[粉刷匠]一题,使用区间DP来做的.自己之前曾经小部分刷过背包DP的题目,对于区间DP还是知之甚少.在稍 ...

  6. POJ 1991 Turning in Homework ★(区间DP)

    题目大意:在一条长为 H (0..1000) 的走廊上有 C (0..1000) 个教室,Bessie 需要去每个教室都交一次作业.每个作业有个最早可以提交的时间.Bessie 在交完所有作业后需要去 ...

  7. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 个人笔记 题解

    题目链接:https://ac.nowcoder.com/acm/contest/90#question A.跳台阶 链接:https://ac.nowcoder.com/acm/contest/90 ...

  8. 2019第十届蓝桥杯JAVA G组题解

    蓝桥杯历年真题及解析. 试题 A: 立方和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 ...

  9. 【算法笔记题解】PAT A.1095 Cars on Campus (30 分)

    前言 今天不开心就撸了一道PAT的题. 所有的合集相关源码我都更新在gitee上了需要自取xingleigao/study - Gitee.com 题目描述 1095 Cars on Campus ( ...

  10. 河南省第十届大学生程序设计竞赛 A,B,C,D,F,G,H 题解

    H: Intelligent Parking Building 时间限制: 1 Sec  内存限制: 128 MB 提交: 22  解决: 20 [提交][状态][讨论版] 题目描述 There is ...

最新文章

  1. 从AlexNet到BERT:深度学习中那些最重要idea的最简单回顾
  2. eVC++就是eVC++啊
  3. 唔... 突然发现进入推荐博客了
  4. python中main的作用_浅析python 中__name__ = '__main__' 的作用
  5. 关于ViewTreeObserver的理解
  6. dlink虚拟服务器端口转发,D-Link路由器端口转发怎么设置【图文教程】
  7. oracle pl/sql 无监听程序
  8. [转]Windows 下 Apache Virtual hosts 简单配置
  9. wps页码从指定页开始_wps怎么自动生成页码以及设置页码从第三页开始
  10. html5 小车动画_html5 echarts汽车仪表盘图表动画特效
  11. 英语太差怎么办,快来写一个“百词斩”软件给自己背单词
  12. 网上赚钱的好方法,实战案例讲解,让你秒懂赚钱的秘密!
  13. 待嫁闺中:PPTV的辛酸史
  14. android双系统切换软件,可一键切换安卓/Win!双系统设备涌现CES
  15. 第二型曲面积分的定义
  16. python多个箱线图_python-matplotlib | 箱线图及解读
  17. GLES2.0中文API-glUniform
  18. 强强联手:诚迈科技携手研华共同发起嵌入式Linux和Android联盟
  19. 如何防止过拟合(overfitting)
  20. 视频标准 - CCIR601,CCIR656

热门文章

  1. 快速将英文PDF翻译为中文
  2. Racket GUI,使用message%显示图片
  3. 使用python爬取App安卓应用商店评论并生成词云
  4. 快速卸载软件和残余,很Nice的一款卸载工具—Your Unin-staller!
  5. php utc 北京时间,美国各个时区转换成北京时间 utc gmt
  6. (vue)h5 通过高德地图(原生) 获取当前位置定位
  7. 软件开发项目人员配置
  8. 包含类别变量的中介模型检验方法
  9. android 免root 安装xposed,xposed框架免root安装|VAExposed(xposed框架免root版本)1.97最新版 - 维维软件园...
  10. Serekh简介:新资产包,埋藏的回忆,第2卷