前言
有一说一,这是我做过最简单的一道E题
题意
告诉你有个大楼,然后让你求出从一楼到每一楼的最短时间。其中,上楼有两种方式1.走楼梯2.坐电梯。楼梯可以直接走,电梯需要一个等待时间。数据给出层与层之间不算等待时间的两种方式上楼所需的时间。
做法
很容易想到dp,而且是最基础的dp(估计div3也就敢这么出个算法题)
状态dp[i][0]表示走楼梯上到i层所需的最短时间。dp[i][1]表示坐电梯时上到i层所需的最短时间。
转移方程
dp[i][0]=min(dp[i-1][0],dp[i-1][1])+a[i-1][0];
dp[i][1]=min(dp[i-1][0]+a[i-1][1]+m,dp[i-1][1]+a[i-1][1]);
代码
#include<bits/stdc++.h> using namespace std; int n,m; int a[200005][2]; int dp[200005][2]; int main(){ cin>>n>>m; for(int i=1;i<=n-1;i++){ cin>>a[i][0]; } for(int i=1;i<=n-1;i++){ cin>>a[i][1]; } dp[2][0]=a[1][0]; dp[2][1]=a[1][1]+m; for(int i=3;i<=n;i++){ dp[i][0]=min(dp[i-1][0],dp[i-1][1])+a[i-1][0]; dp[i][1]=min(dp[i-1][0]+a[i-1][1]+m,dp[i-1][1]+a[i-1][1]); } for(int i=1;i<=n;i++){ cout<<min(dp[i][0],dp[i][1])<<" "; } }