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

Input
10 2
7 6 18 6 16 18 1 17 17
6 9 3 10 9 1 10 1 5
Output
0 7 13 18 24 35 36 37 40 45
Input
10 1
3 2 3 1 3 3 1 4 1
1 2 3 4 4 1 2 1 3
Output
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的更多相关文章

  1. Codeforces1249E By Elevator or Stairs?

    题意 给定整数c和数组a,b,\(a_i\)表示通过爬楼梯的方法从第\(i\)层到\(i+1\)层需要的时间,\(b_i\)表示通过坐电梯的方法从第\(i\)层到\(i+1\)层需要的时间,坐电梯前需 ...

  2. [题解]Mail.Ru Cup 2018 Round 1 - A. Elevator or Stairs?

    [题目] A. Elevator or Stairs? [描述] Masha要从第x层楼去第y层楼找Egor,可以选择爬楼梯或者坐直升电梯.已知爬楼梯每层需要时间t1:坐直升电梯每层需要时间t2,直升 ...

  3. Codeforces 1249 E. By Elevator or Stairs?

    传送门 首先显然下楼的操作一定是不优的,所以只要考虑上楼 设 $f[i]$ 表示到第 $i$ 层时需要的最少时间 那么首先考虑走楼梯,有转移,$f[i]=f[i-1]+a[i-1]$ 然后考虑坐电梯有 ...

  4. Codeforces 1249E By Elevator or Stairs? 题解

    这题其实和 NIKKEI 2019-2-D Shortest Path on a Line 差不多的啦,都是一种最短路的变形,把多个点和边关联了起来. 题面 你要从一楼到 \(n\) 楼去,每层楼可以 ...

  5. javascript中继承(二)-----借用构造函数继承的个人理解

    本人目录如下: 零.寒暄&回顾 一,借用构造函数 二.事件代理 三,call和apply的用法 四.总结 零.寒暄&回顾 上次博客跟大家分享了自己对原型链继承的理解,想看的同学欢迎猛击 ...

  6. 一步一步深入理解Dijkstra算法

    先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...

  7. Java的内部类真的那么难以理解?

    01 前言 昨天晚上,我把车停好以后就回家了.回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小 ...

  8. 转发对python装饰器的理解

    [Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考   原文  http://blog.csdn.net/sxw3718401/article/details/3951958 ...

  9. http://python.jobbole.com/85056/ 简单 12 步理解 Python 装饰器,https://www.cnblogs.com/deeper/p/7482958.html另一篇文章

    好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函 ...

随机推荐

  1. js上传图片到七牛云存储

    项目开发过程中遇到一个需求,运营人员需要上传图片到七牛云,最开始的做法是,后台对接七牛,然后出一个接口,前端调用接口,先将图片传到后台,然后后台再上传七牛云,用的过程中发现,图片小的情况下还好,图片一 ...

  2. 92、R语言分析案例

    1.读取数据 > bank=read.table("bank-full.csv",header=TRUE,sep=";") > 2.查看数据结构 & ...

  3. Could not open lock file/var/lib/dpkg/lock的解决

    Could not open lock file/var/lib/dpkg/lock的解决 在ubuntu系统中利用apt-get install something的时候,有时候会出现无法获得锁的权 ...

  4. shell编程:expr的数学运算

    运算符两种方式 方式一:expr $num1 operator $num2 方式二:$(($num1 operator $num2)) (方式二在运算符“=”时候会出错) 1+2.sh 这个代码有点问 ...

  5. [Java Performance] 线程及同步的性能之线程池/ThreadPoolExecutors/ForkJoinPool

    线程池和ThreadPoolExecutors   虽然在程序中可以直接使用Thread类型来进行线程操作,但是更多的情况是使用线程池,尤其是在Java EE应用服务器中,一般会使用若干个线程池来处理 ...

  6. python+tushare获取股票和基金每日涨跌停价格

    接口:stk_limit 描述:获取全市场(包含A/B股和基金)每日涨跌停价格,包括涨停价格,跌停价格等,每个交易日8点40左右更新当日股票涨跌停价格. 限量:单次最多提取4800条记录,可循环调取, ...

  7. go build报错cannot find package

    go env 关键数据是这样的 GOPATH="/home/zzy/goProject" GOROOT="/usr/local/go" 项目目录是这样的 goP ...

  8. JQuery 全选 反选 获取Table 中指定td的元素值

    //全选 function initTableCheckbox() { var $thr = $('table thead tr'); var $checkAllTh = $('<th>& ...

  9. enovia plm export to sap

    UPC creation UPC 结构 PLM 使用的UPC 是 14个数字组成的,兼容. 前两位为 0,后12位为有效数字,在SAP中0会被忽略,符合国际UPC通用 规则, 前一位为0,后13 位为 ...

  10. Codeforces 1175E 倍增

    题意:给你n个区间和m次询问,每次询问一个区间[l, r]至少需要几个区间覆盖? 思路:如果只有一个区间,并且区间是整个取值范围的话,这是一个经典的区间覆盖问题,我们都知道贪心可以解决.现在我们需要快 ...