题目链接:
https://codeforces.com/problemset/problem/1249/E
题目大意:
有 n 层楼,告诉你从 i 到 i + 1 的楼层 走楼梯 的时间以及 坐电梯 的时间,做电梯需要等待 c 时间,求解从 1 楼到每一层的最短时间
思路:
构建 dp 方程,dp[i][j],i 表示楼层,j 为 0 或 1,0 为走楼梯的时间,1 为坐电梯的时间。结束了...
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, c, dp[N][2];
vector <int> a(N), b(N);
int main(){
cin >> n >> c;
dp[1][0] = 0, dp[1][1] = c; //在一楼坐电梯的话,时间为 c
for (int i = 2; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 2; i <= n; i++)
scanf("%d", &b[i]);
for (int i = 2; i <= n; i++){
dp[i][0] = dp[i - 1][0] + a[i];
dp[i][0] = min(dp[i - 1][1] + a[i], dp[i][0]); //走楼梯的最短时间为之前一层走楼梯和坐电梯的最小时间
dp[i][1] = dp[i - 1][0] + b[i] + c; //之前是走楼梯的话,现在做电梯需要等待
if (i != 2) dp[i][1] = min(dp[i - 1][1] + b[i], dp[i][1]); //之前就是做电梯的话,不需要等待
}
for (int i = 1; i <= n; i++)
cout << min(dp[i][0], dp[i][1]) << " \n"[i == n];
return 0;
}