codeforces 984 E. Elevator

题目链接:http://codeforces.com/contest/984/problem/E

题意:就是给你一个9层楼的电梯,然后有n个人,每个人有目前所在楼层和想要去的楼层,然后进出电梯都需要花费1s,电梯上升或者下降1层也需要花费1s。现在要求这n个人上电梯的顺序必须按照给定的顺序,但是出电梯的顺序无所谓(比赛的时候没有看到要按顺序上电梯QAQ)。然后问你最少要花费多少秒把所有人送达。

分析:学习了大佬的想法

   大佬链接:https://blog.csdn.net/xs18952904/article/details/80358587

   感觉别人写的比较好,自己就不写了,经典题++

AC代码:

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int dp[2005][11][11][11][11];
 6 int a[2005],b[2005];
 7 int n;
 8 int dfs(int num,int cnt,int x,int y,int z){
 9     int mx=1e8;
10    // cout<<num<<" "<<x<<" "<<y<<" "<<z<<endl;
11     if(dp[num][cnt][x][y][z]!=0){
12         return dp[num][cnt][x][y][z];
13     }
14     if(x!=0){
15         mx=min(mx,dfs(num,x,0,y,z)+abs(cnt-x)+1);
16     }
17     if(y!=0){
18         mx=min(mx,dfs(num,y,x,0,z)+abs(cnt-y)+1);
19     }
20     if(z!=0){
21         mx=min(mx,dfs(num,z,x,y,0)+abs(cnt-z)+1);
22     }
23     if(num>n){
24         if(x==0&&y==0&&z==0){
25             return 0;
26         }
27         else {
28             return dp[num][cnt][x][y][z]=mx;
29         }
30     }
31     if(x!=0&&y!=0&&z!=0){
32         mx=min(mx,dfs(num+1,b[num],x,y,z)+abs(cnt-a[num])+abs(a[num]-b[num])+2);
33         mx=min(mx,dfs(num+1,x,b[num],y,z)+abs(cnt-a[num])+abs(a[num]-x)+2);
34         mx=min(mx,dfs(num+1,y,x,b[num],z)+abs(cnt-a[num])+abs(a[num]-y)+2);
35         mx=min(mx,dfs(num+1,z,x,y,b[num])+abs(cnt-a[num])+abs(a[num]-z)+2);
36     }
37     else {
38         if(x==0){
39             mx=min(mx,dfs(num+1,a[num],b[num],y,z)+abs(cnt-a[num])+1);
40         }
41         else if(y==0){
42             mx=min(mx,dfs(num+1,a[num],x,b[num],z)+abs(cnt-a[num])+1);
43         }
44         else {
45             mx=min(mx,dfs(num+1,a[num],x,y,b[num])+abs(cnt-a[num])+1);
46         }
47     }
48     return dp[num][cnt][x][y][z]=mx;
49 }
50 int main(){
51     ios_base::sync_with_stdio(false);
52     cin.tie(0);
53     memset(dp,0,sizeof(dp));
54     cin>>n;
55     for(int i=1;i<=n;i++){
56         cin>>a[i]>>b[i];
57     }
58     cout<<dfs(1,1,0,0,0)<<endl;
59 return 0;
60 }
View Code

 

转载于:https://www.cnblogs.com/ls961006/p/9056174.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值