题目链接: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 }