UVA12825

题意:给定你机器的指令 L(左转) R(右转) F(直走) ?(前三项  未知),问你最终位置,x和y的范围/

解题思路:  dp[i][j]{MINX,MINY,MAXX,MAXY}  表示  到了第i个指令,方向 为 j(1-4)的最值, DP即可 。

解题代码:

  1 // File Name: d.cpp
  2 // Author: darkdream
  3 // Created Time: 2014年10月21日 星期二 21时54分34秒
  4 
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #define LL long long
 25 #define inf 1000000;
 26 using namespace std;
 27 char str[1004];
 28 int dp[1004][6][6];
 29 void print(int t)
 30 {
 31   for(int i = 1;i <= 4;i ++)
 32   {
 33      for(int j = 1;j <= 4;j ++)
 34          printf("%d ",dp[t][i][j]);
 35      printf("
");
 36   }
 37   printf("
");
 38 }
 39 void init(int t)
 40 {
 41     for(int i = 1;i <= 4 ;i ++)
 42         for(int j = 1;j <= 4;j ++ )
 43             if(j == 1 || j == 3)
 44             {
 45                 dp[t][i][j] = -inf;
 46             }else {
 47                 dp[t][i][j] = inf;
 48             }
 49 }
 50 int main(){
 51     int ca = 0 ;
 52     while(scanf("%s",str) != EOF)
 53     {
 54         ca ++ ; 
 55         init(0);
 56         for(int i = 1;i <= 4;i ++)
 57             dp[0][1][i] = 0 ;
 58         int len = strlen(str);
 59         int t = 0 ;
 60         //print(0);
 61         for(int i = 0 ;i < len ;i ++)
 62         {
 63             if(str[i] == 'R')
 64             {
 65                 for(int j = 1 ; j <= 4;j ++)
 66                     memcpy(dp[t][j-1],dp[t][j],sizeof(dp[0][0]));
 67                 memcpy(dp[t][4],dp[t][0],sizeof(dp[0][0]));
 68             }else if(str[i] == 'L'){
 69                 for(int j = 4 ; j >= 1;j --)
 70                     memcpy(dp[t][j+1],dp[t][j],sizeof(dp[0][0]));
 71                 memcpy(dp[t][1],dp[t][5],sizeof(dp[0][0]));
 72             }else if(str[i] == 'F'){
 73                 for(int j = 1;j <= 4;j ++)
 74                 {
 75                     if(j == 1)
 76                     {
 77                         dp[t][j][1] ++; 
 78                         dp[t][j][2] ++;
 79                     }else if(j == 2)
 80                     {
 81                         dp[t][j][3] ++; 
 82                         dp[t][j][4] ++;
 83                     }else if(j == 3)
 84                     {
 85                         dp[t][j][1] --; 
 86                         dp[t][j][2] --;
 87                     }else {
 88                         dp[t][j][3] --; 
 89                         dp[t][j][4] --;
 90                     }
 91                 }
 92             }else{
 93                 t ++ ; 
 94                 init(t);
 95                 int s1,s;
 96                 for(int j = 1;j <= 4 ;j ++)
 97                 {
 98                     int ne = (j == 4 ? 1:j + 1) ;
 99                     for(s = 1 ,s1 = 2; s <= 4l; s += 2, s1 += 2)
100                     {
101                         if(dp[t-1][j][s] > dp[t][ne][s])
102                         {
103                             dp[t][ne][s] = dp[t-1][j][s];
104                         }
105                         if(dp[t-1][j][s1] <  dp[t][ne][s1])
106                         {
107                             dp[t][ne][s1] = dp[t-1][j][s1];
108                         }
109                     }
110                     ne = (j == 1 ? 4:j - 1);
111                     for(s = 1 ,s1 = 2; s <= 4; s += 2, s1 += 2)
112                     {
113                         if(dp[t-1][j][s] > dp[t][ne][s])
114                         {
115                             dp[t][ne][s] = dp[t-1][j][s];
116                         }
117                         if(dp[t-1][j][s1] <  dp[t][ne][s1])
118                         {
119                             dp[t][ne][s1] = dp[t-1][j][s1];
120                         }
121                     }
122 
123                 }
124                 for(int j = 1;j <= 4;j ++) 
125                 {
126                     if(j == 1)
127                     {
128                         dp[t][j][1] = max(dp[t][j][1],dp[t-1][j][1] + 1);
129                         dp[t][j][2] = min(dp[t][j][2],dp[t-1][j][2] + 1);
130                         dp[t][j][3] = max(dp[t][j][3],dp[t-1][j][3] );
131                         dp[t][j][4] = min(dp[t][j][4],dp[t-1][j][4] );
132                     }else if(j == 2)
133                     {
134                         dp[t][j][1] = max(dp[t][j][1],dp[t-1][j][1]);
135                         dp[t][j][2] = min(dp[t][j][2],dp[t-1][j][2]);
136                         dp[t][j][3] = max(dp[t][j][3],dp[t-1][j][3] + 1);
137                         dp[t][j][4] = min(dp[t][j][4],dp[t-1][j][4] + 1);
138                     }else if(j == 3)
139                     {
140                         dp[t][j][1] = max(dp[t][j][1],dp[t-1][j][1] - 1);
141                         dp[t][j][2] = min(dp[t][j][2],dp[t-1][j][2] - 1);
142                         dp[t][j][3] = max(dp[t][j][3],dp[t-1][j][3] );
143                         dp[t][j][4] = min(dp[t][j][4],dp[t-1][j][4] );
144                     }else{
145                         dp[t][j][1] = max(dp[t][j][1],dp[t-1][j][1]);
146                         dp[t][j][2] = min(dp[t][j][2],dp[t-1][j][2]);
147                         dp[t][j][3] = max(dp[t][j][3],dp[t-1][j][3] - 1);
148                         dp[t][j][4] = min(dp[t][j][4],dp[t-1][j][4] - 1);
149                     }
150                 }
151             }
152 
153         //print(t);
154         }
155         int minx ,maxx,miny ,maxy;
156         minx = miny = inf;
157         maxx = maxy = -inf;
158         for(int j = 1;j <= 4;j ++)
159         {
160             if(dp[t][j][1] > maxx)
161                 maxx = dp[t][j][1];
162             if(dp[t][j][2] < minx)
163                 minx = dp[t][j][2];
164             if(dp[t][j][3] > maxy)
165                 maxy = dp[t][j][3];
166             if(dp[t][j][4] < miny)
167                 miny = dp[t][j][4];
168         }
169         printf("Case %d: %d %d %d %d
",ca,minx,maxx,miny,maxy);
170     }
171     return 0;
172 }
View Code
没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/4042728.html