有四个踩踏板,不同的踩踏方式消耗不同的力气
问最小花费的力气
F[ i ] [ a] [b ][ s] , s 是上一次哪只角移动了( 0 ,1,2 )
https://www.luogu.com.cn/problem/UVA10618
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include<iostream> #include <cstring> #include <algorithm> const int N =1003; #define inf 1e9 #define UP 0 #define LEFT 1 #define RIGHT 2 #define DOWN 3 char str[N] ,opt[]= ".LR" ; int n,f[N][5][5][3], op[N][4][4][3]; int get( int a, int b){ if (a == b) return 3; if (a+b == 3) return 7; return 5; } int energy( int i, int a, int b, int s, int g, int t, int &ta, int &tb){ ta=a,tb=b; if (g == 1) ta=t; else if (g == 2) tb=t; if (ta == tb) return -1; if (ta == RIGHT && tb == LEFT) return -1; if (a == RIGHT && tb != b) return -1; if (b == LEFT && ta != a) return -1; int res; if (g == 0) res=0; else if (g != s) res=1; else { if (g == 1) res=get(a,ta); else res=get(b,tb); } return res; } void mov( int i, int a, int b, int s, int g, int t){ int ta,tb; int E=energy(i,a,b,s,g,t,ta,tb); if (E < 0) return ; int cost=f[i+1][ta][tb][g]+E; int &v=f[i][a][b][s]; if (cost < v){ v=cost; op[i][a][b][s]=g*4+t; } } void sov(){ int i ,a,b; for (i=n-1;i>=0;i--) for (a=0;a<4;a++) for (b=0;b<4;b++) if (a!=b) { for ( int s=0;s<3;s++){ f[i][a][b][s] = inf ; if (str[i]== '.' ){ mov(i,a,b,s,0,0) ; for ( int t=0;t<4;t++){ mov(i,a,b,s,1,t); mov(i,a,b,s,2,t); } } else { if (str[i]== 'U' ){ mov(i,a,b,s,1,0); mov(i,a,b,s,2,0); } else if (str[i]== 'L' ){ mov(i,a,b,s,1,1) ; mov(i,a,b,s,2,1); } else if (str[i]== 'R' ){ mov(i,a,b,s,1,2); mov(i,a,b,s,2,2); } else { mov(i,a,b,s,1,3) ; mov(i,a,b,s,2,3) ; } } } } } signed main () { while (std::cin>>str){ if (str[0] == '#' ) break ; n= strlen (str); memset (f,0, sizeof f); sov(); int a=LEFT,b=RIGHT,s=0; for ( int i=0;i<n;++i){ int g=op[i][a][b][s]/4; int t=op[i][a][b][s]%4; printf ( "%c" ,opt[g]); s=g; if (g == 1) a=t; else if (g == 2) b=t; } puts ( "" ); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!