CSU 1510 Happy Robot(字符串上的dp)
来源:互联网 发布:mysql group by 排序 编辑:程序博客网 时间:2024/06/03 18:10
Submit: 182 Solved: 85
[Submit][Status][Web Board]
Description
Input
There will be at most 1000 test cases. Each case contains a command sequence with no more than 1000 characters.
Output
For each test case, print the case number, followed by minimal/maximal possible x (in this order), then the minimal/maximal possible y.
Sample Input
F?FL??LFFFRF
Sample Output
Case 1: 1 3 -1 1Case 2: -1 1 0 2Case 3: 1 1 3 3
解题思路:
这题坑的地方就在于不能够往平面上去想,最开始是dp[x][y][d]表示在坐标(x,y)位置,方向为d,得到的坐标极值。
但肯定超时。。。
所以只能够聪明一点,对字符串做dp了。。
dp[i][j]表示到达第i个字符的命令,此时机器人的方向为j时得到的坐标极值,状态表示出来了,方程就很简单了。。
由于要求Xmin,Xmax,Ymin,Ymax,所以四次DP即可。。
#include<iostream>#include<cstdio>#include<cstring>#define max(a,b) (a) > (b) ? (a) : (b)#define min(a,b) (a) < (b) ? (a) : (b)using namespace std;const int maxn = 1005;const int inf = 0x3f3f3f3f;int dp[maxn][4],n;char str[maxn];int MAX(int a,int b,int c,int d){return max(a,max(b,max(c,d)));}int MIN(int a,int b,int c,int d){return min(a,min(b,min(c,d)));}void DP1(){for(int i = 0; i < n; i++)for(int j = 0; j < 4; j++)dp[i][j] = inf;if(str[0] == 'F')dp[0][1] = 1;else if(str[0] == 'L')dp[0][0] = 0;else if(str[0] == 'R')dp[0][2] = 0;else {dp[0][0] = 0;dp[0][1] = 1;dp[0][2] = 0;}for(int i = 1; i < n; i++)for(int j = 0; j < 4; j++) //上一个指令执行后的方向{if(str[i] == 'F') //前进{if(j == 0) //向上dp[i][j] = min(dp[i][j],dp[i-1][j]);else if(j == 1) //向右dp[i][j] = min(dp[i][j],dp[i-1][j] + 1);else if(j == 2) //向下dp[i][j] = min(dp[i][j],dp[i-1][j]);else //向左dp[i][j] = min(dp[i][j],dp[i-1][j] - 1);}else if(str[i] == 'L'){int d = ((j - 1) % 4 + 4) % 4;dp[i][d] = min(dp[i][d],dp[i-1][j]);}else if(str[i] == 'R'){int d = (j + 1) % 4;dp[i][d] = min(dp[i][d],dp[i-1][j]);}else{if(j == 0) //向上dp[i][j] = min(dp[i][j],dp[i-1][j]);else if(j == 1) //向右dp[i][j] = min(dp[i][j],dp[i-1][j] + 1);else if(j == 2) //向下dp[i][j] = min(dp[i][j],dp[i-1][j]);else //向左dp[i][j] = min(dp[i][j],dp[i-1][j] - 1);int d = ((j - 1) % 4 + 4) % 4;dp[i][d] = min(dp[i][d],dp[i-1][j]);d = (j + 1) % 4;dp[i][d] = min(dp[i][d],dp[i-1][j]);}}}void DP2(){for(int i = 0; i < n; i++)for(int j = 0; j < 4; j++)dp[i][j] = -inf;if(str[0] == 'F')dp[0][1] = 1;else if(str[0] == 'L')dp[0][0] = 0;else if(str[0] == 'R')dp[0][2] = 0;else {dp[0][0] = 0;dp[0][1] = 1;dp[0][2] = 0;}for(int i = 1; i < n; i++)for(int j = 0; j < 4; j++) //上一个指令执行后的方向{if(str[i] == 'F') //前进{if(j == 0) //向上dp[i][j] = max(dp[i][j],dp[i-1][j]);else if(j == 1) //向右dp[i][j] = max(dp[i][j],dp[i-1][j] + 1);else if(j == 2) //向下dp[i][j] = max(dp[i][j],dp[i-1][j]);else //向左dp[i][j] = max(dp[i][j],dp[i-1][j] - 1);}else if(str[i] == 'L'){int d = ((j - 1) % 4 + 4) % 4;dp[i][d] = max(dp[i][d],dp[i-1][j]);}else if(str[i] == 'R'){int d = (j + 1) % 4;dp[i][d] = max(dp[i][d],dp[i-1][j]);}else{if(j == 0) //向上dp[i][j] = max(dp[i][j],dp[i-1][j]);else if(j == 1) //向右dp[i][j] = max(dp[i][j],dp[i-1][j] + 1);else if(j == 2) //向下dp[i][j] = max(dp[i][j],dp[i-1][j]);else //向左dp[i][j] = max(dp[i][j],dp[i-1][j] - 1);int d = ((j - 1) % 4 + 4) % 4;dp[i][d] = max(dp[i][d],dp[i-1][j]);d = (j + 1) % 4;dp[i][d] = max(dp[i][d],dp[i-1][j]);}}}void DP3(){for(int i = 0; i < n; i++)for(int j = 0; j < 4; j++)dp[i][j] = inf;if(str[0] == 'F')dp[0][1] = 0;else if(str[0] == 'L')dp[0][0] = 0;else if(str[0] == 'R')dp[0][2] = 0;else {dp[0][0] = 0;dp[0][1] = 0;dp[0][2] = 0;}for(int i = 1; i < n; i++)for(int j = 0; j < 4; j++) //上一个指令执行后的方向{if(str[i] == 'F') //前进{if(j == 0) //向上dp[i][j] = min(dp[i][j],dp[i-1][j] + 1);else if(j == 1) //向右dp[i][j] = min(dp[i][j],dp[i-1][j]);else if(j == 2) //向下dp[i][j] = min(dp[i][j],dp[i-1][j] - 1);else //向左dp[i][j] = min(dp[i][j],dp[i-1][j]);}else if(str[i] == 'L'){int d = ((j - 1) % 4 + 4) % 4;dp[i][d] = min(dp[i][d],dp[i-1][j]);}else if(str[i] == 'R'){int d = (j + 1) % 4;dp[i][d] = min(dp[i][d],dp[i-1][j]);}else{if(j == 0) //向上dp[i][j] = min(dp[i][j],dp[i-1][j] + 1);else if(j == 1) //向右dp[i][j] = min(dp[i][j],dp[i-1][j]);else if(j == 2) //向下dp[i][j] = min(dp[i][j],dp[i-1][j] - 1);else //向左dp[i][j] = min(dp[i][j],dp[i-1][j]);int d = ((j - 1) % 4 + 4) % 4;dp[i][d] = min(dp[i][d],dp[i-1][j]);d = (j + 1) % 4;dp[i][d] = min(dp[i][d],dp[i-1][j]);}}}void DP4(){for(int i = 0; i < n; i++)for(int j = 0; j < 4; j++)dp[i][j] = -inf;if(str[0] == 'F')dp[0][1] = 0;else if(str[0] == 'L')dp[0][0] = 0;else if(str[0] == 'R')dp[0][2] = 0;else {dp[0][0] = 0;dp[0][1] = 0;dp[0][2] = 0;}for(int i = 1; i < n; i++)for(int j = 0; j < 4; j++) //上一个指令执行后的方向{if(str[i] == 'F') //前进{if(j == 0) //向上dp[i][j] = max(dp[i][j],dp[i-1][j] + 1);else if(j == 1) //向右dp[i][j] = max(dp[i][j],dp[i-1][j]);else if(j == 2) //向下dp[i][j] = max(dp[i][j],dp[i-1][j] - 1);else //向左dp[i][j] = max(dp[i][j],dp[i-1][j]);}else if(str[i] == 'L'){int d = ((j - 1) % 4 + 4) % 4;dp[i][d] = max(dp[i][d],dp[i-1][j]);}else if(str[i] == 'R'){int d = (j + 1) % 4;dp[i][d] = max(dp[i][d],dp[i-1][j]);}else{if(j == 0) //向上dp[i][j] = max(dp[i][j],dp[i-1][j] + 1);else if(j == 1) //向右dp[i][j] = max(dp[i][j],dp[i-1][j]);else if(j == 2) //向下dp[i][j] = max(dp[i][j],dp[i-1][j] - 1);else //向左dp[i][j] = max(dp[i][j],dp[i-1][j]);int d = ((j - 1) % 4 + 4) % 4;dp[i][d] = max(dp[i][d],dp[i-1][j]);d = (j + 1) % 4;dp[i][d] = max(dp[i][d],dp[i-1][j]);}}}int main(){int cas = 1;while(scanf("%s",str)!=EOF){n = strlen(str);DP1();printf("Case %d: %d ",cas++,MIN(dp[n-1][0],dp[n-1][1],dp[n-1][2],dp[n-1][3]));DP2();printf("%d ",MAX(dp[n-1][0],dp[n-1][1],dp[n-1][2],dp[n-1][3]));DP3();printf("%d ",MIN(dp[n-1][0],dp[n-1][1],dp[n-1][2],dp[n-1][3]));DP4();printf("%d\n",MAX(dp[n-1][0],dp[n-1][1],dp[n-1][2],dp[n-1][3]));}return 0;}
0 0
- CSU 1510 Happy Robot(字符串上的dp)
- CSU 1510 Happy Robot(字符串上的dp)
- CSU 1510 Happy Robot DP
- csu 1510 Happy Robot(字符串DP,记忆化搜索)
- CSU 1510Happy Robot(dp)
- 湖南14年省赛 H - Happy Robot dp
- CSU 1804 有向无环图(图上的dp)
- CSU 1098 Happy watering
- CSU 1098 Happy watering
- csu1510: Happy Robot
- CSU 1902: Happy Chinese Poker
- csu1510 Happy Robot 递推
- CSU 1919:不醉不归(神奇的dp)
- 1001 Post Robot--字符串的比较问题
- CSU 1098: Happy watering(线段树)
- Robot Framework在windows上的搭建
- CSU 1529 Equator DP
- CSU 1529: Equator(dp)
- 项目应用:http状态码大全
- 状态机的两种写法
- GPS和北斗导航都能被欺骗,你还敢用导航吗?
- 让CPU占有率曲线听你指挥
- SKETCH 切出背景透明的图标
- CSU 1510 Happy Robot(字符串上的dp)
- AutoItX运行报错"com.jacob.com.ComFailException: Can't co-create object"
- linux断开连接后进程死掉的问题
- Nginx配置文件(nginx.conf)配置详解(转载)
- 一致性hash算法
- Spring-IOC-学习笔记(1)
- 关于ioutil.ReadAll()的阻塞问题
- iOS UICollectionView
- 集成支付宝钱包支付iOS SDK的方法与经验