随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

有四个踩踏板,不同的踩踏方式消耗不同的力气

问最小花费的力气

 

 

 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("");
    }
}

 

posted on   towboat  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示