题目大意:有个n层楼的房子,要求通过2种操作花费最少时间到达楼顶,一种方式是走楼梯,另一种是坐电梯。
解题思路:这2个操作有个区别是走楼梯不需要等待时间,而坐电梯需要等待时间。也就是说一个连续区间内只需要加一次等待时间。在上楼的过程中,我们有2种选择,走楼梯和坐电梯。那么由等待时间可以想到,我们要上楼时是在楼梯上还是在电梯中,因为在电梯中继续选择电梯上楼是不需要等待时间的。所以我们可以得到4种状态:(1)在楼梯上楼梯(2)在楼梯上电梯(3)在电梯上楼梯(4)在电梯上电梯
代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 200010
const int inf=0x3f3f3f3f;
int dp[5][maxn];
int a[maxn],b[maxn];
//(1)在楼梯上楼梯(2)在楼梯上电梯(3)在电梯上楼梯(4)在电梯上电梯
int main()
{
int n,c;
scanf("%d%d",&n,&c);
for(int i=1;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<n;i++){
scanf("%d",&b[i]);
}
for(int i=1;i<=n;i++)dp[0][i]=dp[1][i]=inf;
dp[0][0]=0;dp[1][0]=c;
for(int i=1;i<n;i++){
dp[0][i]=min(dp[0][i],dp[0][i-1]+a[i]);
dp[1][i]=min(dp[1][i],dp[0][i-1]+b[i]+c);
dp[0][i]=min(dp[0][i],dp[1][i-1]+a[i]);
dp[1][i]=min(dp[1][i],dp[1][i-1]+b[i]);
}
for(int i=0;i<n;i++){
printf("%d ",min(dp[0][i],dp[1][i]));
}
return 0;
}