题目地址: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 }
原文地址:https://www.cnblogs.com/xunzf0402/p/11734678.html
时间: 2024-10-08 06:43:45