Codeforces Round #595 (Div. 3) E. By Elevator or Stairs?

题目地址:http://codeforces.com/contest/1249/problem/E

题意:有n层楼,上楼有楼梯和电梯两种方法,从 i 到 i+1 层有不同花费,用电梯有等电梯门开的时间,但上一次用的电梯就不用等这个时间。问去每层楼的最小花费。

思路:很基础的dp题,dp [ i ] [ 0 ] 表示一楼到 i楼的总时间,其中从 i - 1 楼到 i 楼用的是楼梯,dp [ i ] [ 1 ] 表示从一楼到 i 楼的总时间,其中 i - 1 到 i 楼用的电梯。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 const int N=2e5+5;
 8 ll n,c,a[N],b[N],dp[N][2];
 9 void sol(){
10 
11     cin>>n>>c;
12     for(int i=2;i<=n;i++) cin>>a[i];
13     for(int i=2;i<=n;i++) cin>>b[i];
14 
15     dp[1][0]=0;     //初始化,一楼直接是0时间,且不能有用过电梯这个状态
16     dp[1][1]=2e8+10;
17 
18     for(int i=2;i<=n;i++){      //转移方程
19         dp[i][0]=min(dp[i-1][0]+a[i],dp[i-1][1]+a[i]);
20         dp[i][1]=min(dp[i-1][0]+b[i]+c,dp[i-1][1]+b[i]);    //前一层用过电梯就不用加c这个等门时间了
21     }
22     for(int i=1;i<=n;i++){  //取小的就OK了
23         ll ans=min(dp[i][0],dp[i][1]);
24         cout<<ans<<" ";
25     }
26 }
27 int main(){
28     sol();
29     return 0;
30 }

猜你喜欢

转载自www.cnblogs.com/xunzf0402/p/11734678.html