• 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
    没有梦想,何谈远方
  • 相关阅读:
    Log4Net 发布后不能用
    主机ping不通虚拟机
    c# Delegate 和 Events
    ADO.NET
    .NET Windows Service
    Linux 常用命令三 touch mkdir
    Linux 常用命令二 pwd cd
    Linux 常用命令一 ls
    python 面向对象六 动态添加方法 __slots__限制动态添加方法
    python 面向对象六 类属性和实例属性
  • 原文地址:https://www.cnblogs.com/zyue/p/4042728.html
Copyright © 2020-2023  润新知