Codeforces Gym101201B:Buggy Robot(BFS + DP)
题意
给出一个n*m的地图,还有一个操作序列,你原本是要按照序列执行操作的,但是你可以修改操作:删除某些操作或者增加某些操作,问从'R'到'E'最少需要多少次修改操作。
思路
和上次比赛做的一道字符串题目有点类似。
定义状态dp[x][y][d]代表在(x,y)这个点执行到了第d个操作。因此有三种情况:不变,增加,删除。
不变:就按照原来的序列走,如果走到不合法,就原地不动。转移:dp[x][y][d] = min(dp[x][y][d], dp[nx][ny][d+1])。
其实增加和删除操作是一样的,因为删除操作就相当于你执行走到另一个点,然后增加一个操作,走回来,因此可以一起讨论为增加操作。转移:dp[x][y][d] = min(dp[x][y][d], dp[nx][ny][d])。注意这里的d是不变的,因为只是增加操作,并不影响原来的操作序列。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int N = 50 + 11;
struct Node {
	int x, y, d;
	Node () {}
	Node (int _x, int _y, int _d) : x(_x), y(_y), d(_d) {}
} ;
char mp[N][N], s[N];
int dp[N][N][2*N], dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
map<char, int> ying;
queue<Node> que;
int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) scanf(" %s", mp[i] + 1);
	int sx, sy, ex, ey;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			if(mp[i][j] == 'R') sx = i, sy = j;
			else if(mp[i][j] == 'E') ex = i, ey = j;
	scanf(" %s", s + 1);
	int len = strlen(s + 1);
	ying['D'] = 0, ying['U'] = 1, ying['R'] = 2, ying['L'] = 3;
	memset(dp, INF, sizeof(dp));
	Node now = Node(sx, sy, 1);
	que.push(now); dp[sx][sy][1] = 0;
	int dep = 0;
	while(!que.empty()) {
		now = que.front(); que.pop();
		int x = now.x, y = now.y, d = now.d, nx, ny, nd;
		if(d > dep) dep = d;
		if(d <= len) {
			int c = ying[s[d]];
			nx = x + dx[c], ny = y + dy[c], nd = d + 1;
			if(nx < 1 || nx > n || ny < 1 || ny > m || mp[nx][ny] == '#') nx = x, ny = y;
			if(dp[nx][ny][nd] > dp[x][y][d])
				dp[nx][ny][nd] = dp[x][y][d], que.push(Node(nx, ny, nd));
		}
		for(int c = 0; c < 4; c++) {
			nx = x + dx[c], ny = y + dy[c], nd = d;
			if(nx < 1 || nx > n || ny < 1 || ny > m || mp[nx][ny] == '#') nx = x, ny = y;
			if(dp[nx][ny][nd] > dp[x][y][d] + 1)
				dp[nx][ny][nd] = dp[x][y][d] + 1, que.push(Node(nx, ny, nd));
		}
	}
	int ans = INF;
	for(int i = 1; i <= dep; i++) ans = ans > dp[ex][ey][i] ? dp[ex][ey][i] : ans;
	printf("%d\n", ans);
}
												
											Codeforces Gym101201B:Buggy Robot(BFS + DP)的更多相关文章
- CodeForces - 1073E :Segment Sum (数位DP)
		
You are given two integers l l and r r (l≤r l≤r ). Your task is to calculate the sum of numbers from ...
 - codeforces 295C Greg and Friends(BFS+DP)
		
One day Greg and his friends were walking in the forest. Overall there were n people walking, includ ...
 - Cleaning Robot (bfs+dfs)
		
Cleaning Robot (bfs+dfs) Here, we want to solve path planning for a mobile robot cleaning a rectangu ...
 - ZOJ 3596Digit Number(BFS+DP)
		
一道比较不错的BFS+DP题目 题意很简单,就是问一个刚好包含m(m<=10)个不同数字的n的最小倍数. 很明显如果直接枚举每一位是什么这样的话显然复杂度是没有上限的,所以需要找到一个状态表示方 ...
 - Codeforces Gym100502H:Clock Pictures(KMP算法)
		
http://codeforces.com/gym/100502/attachments 题意:有两个时钟上面有n个指针,给出的数字代表指针的角度.问能否在某一时刻使得两个时钟的指针重合. 思路:容易 ...
 - Codeforces 777E:Hanoi Factory(贪心+栈)
		
http://codeforces.com/problemset/problem/777/E 题意:给出n个环状圆柱,每个圆环有一个内半径a,外半径b,和高度h,只有外半径bj <= bi并且b ...
 - Codeforces 758C:Unfair Poll(思维+模拟)
		
http://codeforces.com/problemset/problem/758/C 题意:教室里有n列m排,老师上课点名从第一列第一排开始往后点,直到点到第一列第m排,就从第二列第一排开始点 ...
 - codeforces 486 D. Valid Sets(树形dp)
		
题目链接:http://codeforces.com/contest/486/problem/D 题意:给出n个点,还有n-1条边的信息,问这些点共能构成几棵满足要求的树,构成树的条件是. 1)首先这 ...
 - 【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)
		
\(IDA^*\) 说实话,这道题我一开始没想出正解,于是写了一个\(IDA^*\)... 但神奇的是,这个\(IDA^*\)居然连字符串长度分别为\(2500,4000\)的数据都跑得飞快,不过数据 ...
 
随机推荐
- C# 操作XML文档 使用XmlDocument类方法
			
W3C制定了XML DOM标准.很多编程语言中多提供了支持W3C XML DOM标准的API.我在之前的文章中介绍过如何使用Javascript对XML文档进行加载与查询.在本文中,我来介绍一下.Ne ...
 - 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机
			
原文:用MVVM模式开发中遇到的零散问题总结(5)--将动态加载的可视元素保存为图片的控件,Binding刷新的时机 在项目开发中经常会遇到这样一种情况,就是需要将用户填写的信息排版到一张表单中,供打 ...
 - Win8 Metro(C#)数字图像处理--2.61哈哈镜效果
			
原文:Win8 Metro(C#)数字图像处理--2.61哈哈镜效果  [函数名称] 哈哈镜效果函数 WriteableBitmap DistortingMirrorProcess(Writea ...
 - VS点击调试卡住的问题解决方案(转载)
			
本来今天好好的,不知道弄到了什么,调试不了了,一点击立马卡住,就一直在那转,就在网上找了找解决方案,下面给大家列出来几种可能会卡住的问题已经解决方案 1:加载调试符号引起的卡住 解决方案: 在“选项” ...
 - Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅
			
原文:Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Android开发 ...
 - 【UWP开发】uwp应用安装失败
			
原文:[UWP开发]uwp应用安装失败 编译出了uwp应用.appx之后双击打开,报错你需要为此应用包而安装的新证书,或者是带有受信任证书的新应用包.系统管理员或应用开发人员可以提供帮助.证书链在不受 ...
 - 全面提价2499元起小米6发布:四曲陶瓷机身+骁龙835+变焦双摄(小米在设计上也多次获得红点最佳、iF金奖等72项工业设计大奖)
			
集微网 4月19日报道 今日,小米公司在北京召开正式推出了新一代旗舰手机“小米手机6”.在试玩过真机后,第一感觉就是这款手机做工与颜值相比此前小米手机提升巨大:有四曲面玻璃或陶瓷机身.不锈钢高亮边框 ...
 - 把握每次机会,麒麟芯片5年成就高端(SoC包括AP、基带、ISP等,华为确实牛)
			
从2016年11月华为Mate 9 /Mate 9 Pro发布,到2017年2月荣耀V9和华为P10 /P10 Plus 相继发布,这几款都是华为和荣耀的高端旗舰机型,且搭载的都是华为最新旗舰芯片-- ...
 - Redis 高可用之哨兵模式
			
参考 : https://mp.weixin.qq.com/s/Z-PyNgiqYrm0ZYg0r6MVeQ 一.redis高可用解决方案 redis主从 优点:1.高可靠性,主从实时备份,有效解 ...
 - Fundamentals Code Library,包含HTTP TCP JSON BigInteger 加密算法 Unicode等许多东西
			
http://fundementals.sourceforge.net/index.html https://github.com/fundamentalslib/fundamentals5 http ...