CodeForces1249E-By Elevator or Stairs?-好理解自己想不出来的dp

Input
The first line of the input contains two integers nn and cc (2≤n≤2⋅105,1≤c≤10002≤n≤2⋅105,1≤c≤1000) — the number of floors in the building and the time overhead for the elevator rides.
The second line of the input contains n−1n−1 integers a1,a2,…,an−1a1,a2,…,an−1 (1≤ai≤10001≤ai≤1000), where aiai is the time required to go from the ii-th floor to the (i+1)(i+1)-th one (and from the (i+1)(i+1)-th to the ii-th as well) using the stairs.
The third line of the input contains n−1n−1 integers b1,b2,…,bn−1b1,b2,…,bn−1 (1≤bi≤10001≤bi≤1000), where bibi is the time required to go from the ii-th floor to the (i+1)(i+1)-th one (and from the (i+1)(i+1)-th to the ii-th as well) using the elevator.
Output
Print nn integers t1,t2,…,tnt1,t2,…,tn, where titi is the minimum total time to reach the ii-th floor from the first floor if you can perform as many moves as you want.
Examples
10 2
7 6 18 6 16 18 1 17 17
6 9 3 10 9 1 10 1 5
0 7 13 18 24 35 36 37 40 45
10 1
3 2 3 1 3 3 1 4 1
1 2 3 4 4 1 2 1 3
0 2 4 7 8 11 13 14 16 17 题意:
给出n、c,表示有n层楼,等电梯需要c时间;
给出两行数,每行有n-1个数,
第一行stairs代表从1楼到每层楼走楼梯需要的时间
第二行elevator代表从1楼到每层楼乘电梯需要的时间;
需要注意的是,从电梯转电梯不需要等待时间,从楼梯转楼梯也不需要等待时间,
但是从楼梯转电梯需要算上等待的时间 t 。
求:
从1楼到每层楼所需的最短时间,输出应该有n-1个时间。 思路:
由于存在两种状态,所以可以用0代表乘电梯,1代表走楼梯;
所以一开始可以按照题目所给的开一个三维数组dp [ i ] [ j ] [ k ],i代表乘电梯还是走楼梯,j代表当前到达第几层,k代表将要去第几层。
所以一开始进行dp清空
接下来赋初值,由于不知道从1楼往上走是等电梯还是走楼梯,所以假设等电梯的话需要赋初值dp=c,算上等电梯的时间。
初始化如下:
memset(dp,0,sizeof(dp));
dp[][][]=c;//电梯来电梯走,需要等电梯
dp[][][]=c;//电梯来楼梯走,需要等电梯
dp[][][]=;//楼梯来电梯走
dp[][][]=;//楼梯来楼梯走
之后不管是走楼梯还是乘电梯都需要加上楼梯到楼梯或者电梯到电梯转的时间。如果碰到楼梯转电梯的情况,加上c即可。
动态转移方程如下:
dp[i][][]=min(dp[i-][][]+b[i-],dp[i-][][]+b[i-]+c);
dp[i][][]=min(dp[i-][][]+b[i-],dp[i-][][]+b[i-]+c);
dp[i][][]=min(dp[i-][][]+a[i-],dp[i-][][]+a[i-]);
dp[i][][]=min(dp[i-][][]+a[i-],dp[i-][][]+a[i-]);
三维代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=2e5+; int a[N],b[N];
int dp[N][][]; //dp[i][j][k] 到达第几层,j来,k走
//0电梯 1楼梯
int main()
{
int n,c;
while(~scanf("%d %d",&n,&c))
{
memset(dp,,sizeof(dp));
// for(int i=2;i<=n;i++)//0 7 13 18 24 35 36 37 40 45
// wa 0 0 7 13 18 24 35 36 37 40
for(int i=; i<n; i++)
scanf("%d",&a[i]);//楼梯1
for(int i=; i<n; i++)
scanf("%d",&b[i]);//电梯0
dp[][][]=c;//电梯来电梯走,需要等电梯
dp[][][]=c;//电梯来楼梯走,需要等电梯
dp[][][]=;//楼梯来电梯走
dp[][][]=;//楼梯来楼梯走
for(int i=; i<=n; i++)
{
dp[i][][]=min(dp[i-][][]+b[i-],dp[i-][][]+b[i-]+c);
dp[i][][]=min(dp[i-][][]+b[i-],dp[i-][][]+b[i-]+c);
dp[i][][]=min(dp[i-][][]+a[i-],dp[i-][][]+a[i-]);
dp[i][][]=min(dp[i-][][]+a[i-],dp[i-][][]+a[i-]);
}
printf("0 ");
for(int i=;i<=n;i++)
{
if(i!=)
printf(" ");
int w=min(dp[i][][],dp[i][][]);
int ww=min(w,dp[i][][]);
int www=min(ww,dp[i][][]);
printf("%d",www);
}
printf("\n");
}
return ;
}
优化后的二维代码:
经过三维数组观察可得:
dp[i][][]=dp[i][][]=min(dp[i-][][]+b[i-],dp[i-][][]+b[i-]+c);
dp[i][][]=dp[i][][]=min(dp[i-][][]+a[i-],dp[i-][][]+a[i-]);
所以与从哪来有关,与到哪去无关
从而可以写成二维数组
代码如下:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=2e5+; int a[N],b[N],dp[N][]; //dp[i][j][k] 到达第几层,j来,k走
//0电梯 1楼梯 int main()
{
int n,c;
while(~scanf("%d %d",&n,&c))
{
memset(dp,,sizeof(dp));
for(int i=; i<n; i++)
scanf("%d",&a[i]);//楼梯1
for(int i=; i<n; i++)
scanf("%d",&b[i]);//电梯0
dp[][]=c;
dp[][]=;
for(int i=; i<=n; i++)
{
dp[i][]=min(dp[i-][]+b[i-],dp[i-][]+b[i-]+c);
dp[i][]=min(dp[i-][]+a[i-],dp[i-][][]+a[i-]);
}
printf("0 ");
for(int i=;i<=n;i++)
{
if(i!=)
printf(" ");
int w=min(dp[i][],dp[i][]);
printf("%d",w);
}
printf("\n");
}
return ;
}
CodeForces1249E-By Elevator or Stairs?-好理解自己想不出来的dp的更多相关文章
- Codeforces1249E By Elevator or Stairs?
题意 给定整数c和数组a,b,\(a_i\)表示通过爬楼梯的方法从第\(i\)层到\(i+1\)层需要的时间,\(b_i\)表示通过坐电梯的方法从第\(i\)层到\(i+1\)层需要的时间,坐电梯前需 ...
- [题解]Mail.Ru Cup 2018 Round 1 - A. Elevator or Stairs?
[题目] A. Elevator or Stairs? [描述] Masha要从第x层楼去第y层楼找Egor,可以选择爬楼梯或者坐直升电梯.已知爬楼梯每层需要时间t1:坐直升电梯每层需要时间t2,直升 ...
- Codeforces 1249 E. By Elevator or Stairs?
传送门 首先显然下楼的操作一定是不优的,所以只要考虑上楼 设 $f[i]$ 表示到第 $i$ 层时需要的最少时间 那么首先考虑走楼梯,有转移,$f[i]=f[i-1]+a[i-1]$ 然后考虑坐电梯有 ...
- Codeforces 1249E By Elevator or Stairs? 题解
这题其实和 NIKKEI 2019-2-D Shortest Path on a Line 差不多的啦,都是一种最短路的变形,把多个点和边关联了起来. 题面 你要从一楼到 \(n\) 楼去,每层楼可以 ...
- javascript中继承(二)-----借用构造函数继承的个人理解
本人目录如下: 零.寒暄&回顾 一,借用构造函数 二.事件代理 三,call和apply的用法 四.总结 零.寒暄&回顾 上次博客跟大家分享了自己对原型链继承的理解,想看的同学欢迎猛击 ...
- 一步一步深入理解Dijkstra算法
先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...
- Java的内部类真的那么难以理解?
01 前言 昨天晚上,我把车停好以后就回家了.回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小 ...
- 转发对python装饰器的理解
[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文 http://blog.csdn.net/sxw3718401/article/details/3951958 ...
- http://python.jobbole.com/85056/ 简单 12 步理解 Python 装饰器,https://www.cnblogs.com/deeper/p/7482958.html另一篇文章
好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函 ...
随机推荐
- HTML5: HTML5 应用程序缓存
ylbtech-HTML5: HTML5 应用程序缓存 1.返回顶部 1. HTML5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线 ...
- VPS性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench和压力测试
现在便宜的VPS主机越来越多了,一些美国的VPS主机甚至给出1美元一月的VPS,堪比虚拟主机还要便宜,巨大的价格优势吸引不少人购买和使用,而近些年来国内的主机商也开始意识到便宜的VPS对草根站长的诱惑 ...
- 阿里云epel源
epel是个好东西,不过国外的速度实在是不能忍受.所以 有了这篇文章.1. 首先卸载以前装的epel以免影响 rpm -e epel-release 2. 下载阿里提供的epel wget -P /e ...
- PHP处理地址匹配出省市区
function handleAddress($address ='广东省深圳市龙华新区大浪街道同胜科技大厦'){ preg_match('/(.*?(省|自治区|北京市|天津市))/', $addr ...
- Struts1.3——使用MyEclipse集成工具开发Struts
前面两篇通过手工写代码,手工配置struts-config.xml文件的方法来开发了一个最简单的struts项目,通过手工的方式旨在学习底层原理细节.当熟悉了以后,我们就不需要再通过纯手工的方式来开发 ...
- Windows操作系统架构
用户态 用户态有四类组件,这四类组件都是以进程形式存在的,也就是说,它们都有自己的进程地址空间(其实就是一套页表). 1. System Support Processes 这些是固化的进程,也就是说 ...
- 泛微weaver_oa filebrowser.jsp 任意目录遍历
url//document/imp/filebrowser.jsp?dir=/etc/
- Xshell与securecrt对比
一.功能对比1.Xshell功能- 支持布局切换- 可调整Script执行顺序- 提供多标签功能- 对linux支持度高- 支持IPv6- 全球用户的多语言支持- 支持用户定义的键映射- 灵活和强大的 ...
- 牛客练习赛53 B 美味果冻
链接:https://ac.nowcoder.com/acm/contest/1114/B来源:牛客 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言10485 ...
- 关于软件IntelliJ IDEA的使用技巧(一)
一,IntelliJ IDEA的下载 点击网址http://www.jetbrains.com/idea/进入官网,点击Download 会出现如下页面 点击Ultimate下的Download,下载 ...