CodeForces - 812B 补 题解

原创 2018年04月16日 19:28:14

这道题一开始以为是有规律的的, 想通过最大区域的0来计算,然后用bfs来解决,但是写到一半又发现思路错了,最后还是学长提醒我用dp思路去做,纪录最右和最左的点,dp已经很久没做了,看了网上其他题解才明白要怎么去维护那些状态,里面有几个点需要注意一下:

1.所有的数都为0

2.最下面楼层的dp方式不一样

3.每次dp要保存前一个的状态 因为下一次会变化

AC代码:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int dp[20][110];
char mapp[20][110];
int n,m;
int x,y;

int main() {
	scanf("%d%d",&n,&m);
	x = -1;
	y = -1;
	for(int i = 1; i <= n; i++) {
		scanf("%s",mapp[i]+1);
		if(x != -1 && y != -1) {
			continue;
		}
		for(int j = 1; j <= m+2; j++) {
			if(mapp[i][j] == '1') {
				x = i;
				y = j;
				break;
			}
		}
	}
	//x纪录的是最上面没有关灯的层数
	if(x == -1 && y == -1) {
		printf("0\n");
	} 
	else {
		int l, r;
		memset(dp, INF, sizeof(dp));
		dp[n][1] = 0;
		for(int  i = n; i > 0; i--) {
			dp[i][1] = min(dp[i][1], dp[i+1][1] + 1);
			dp[i][m+2] = min(dp[i][m+2], dp[i+1][m+2] + 1);
			l = 0;
			r = 0;
			for(int j = 2; j <= m+1; j++) {
				if(mapp[i][j] == '1') {
					if(!l) {
						l = j;
					}
					r = j;
				}
			}
			int w = dp[i][1];//记录
			if(r) {
				dp[i][1] = min(dp[i][1] + 2*(r-1), dp[i][m+2]+m+1);
				//1 到最右边的 5 来回就是(5-1)*2 = 8 步数
			}
			if(l) {
				dp[i][m+2] = min(dp[i][m+2] + 2*(m+2-l), w+m+1);
				//最右的m+2位置到最左的位置为 ((m+2) - l)*2 步数
				// 这里的w是之前标记的dp【i】【1】 因为上一个判断会让这个值发生变化
			}
		}
		l = 0, r = 0;
		for(int i = 1; i <= m+2; i++) {
			if(mapp[x][i] == '1') {
				if(!l) {
					l = i;
				}
				r = i;
			}
		}
		int ans = min(dp[x+1][1] + r, dp[x+1][m+2] + (m+2-l) + 1);
		if(x == n) {
			ans = r - 1;
		}
		printf("%d\n",ans);
	}
	return 0;
}

补基础之shell和Makefile-2.2.uboot和系统移植第2部分

-
  • 1970年01月01日 08:00

Codeforces812B Sagheer, the Hausmeister

B. Sagheer, the Hausmeister time limit per test 1 second memory limit per test 256 megab...
  • Jelly_acm
  • Jelly_acm
  • 2017-06-02 20:47:56
  • 302

Codeforces 812B-Sagheer, the Hausmeister

Sagheer, the Hausmeister time limit per test 1 second memory limit per test 256 megabyte...
  • a664607530
  • a664607530
  • 2017-06-02 10:43:33
  • 695

CodeForces - 812B

Some people leave the lights at their workplaces on when they leave that is a waste of resources. As...
  • NineFailure
  • NineFailure
  • 2017-06-03 22:58:16
  • 353

Sagheer, the Hausmeister CodeForces - 812B dp

题目链接 思路: 只说一下这个题dp的思想吧,我们对于每一行都记录最左端未关灯的位置,和最右端未关灯的位置,那么对于左端和右端的楼梯维护一下是将本层楼灯全部关闭原路返回花的时间少,还是从右...
  • HowardEmily
  • HowardEmily
  • 2017-06-03 17:49:15
  • 289

动态规划题解

  • 2013年12月22日 21:06
  • 1KB
  • 下载

Codeforces Round #366 题解

Codeforces 366 Ant Man Black Widow
  • baidu_23081367
  • baidu_23081367
  • 2016-08-09 16:27:18
  • 650

【题解】codeforces766D Mahmoud and a Dictionary

题目链接 题意:有n个单词,给定m个关系,每个关系要么表示单词a与单词b相同,要么表示单词a与单词b相反。并且“相同”与“相反”有性质:若a与b相同,b与c相同,则a与c相同(从而单词的相同关系是等价...
  • ZJZNKU
  • ZJZNKU
  • 2017-02-08 16:41:45
  • 491

2018-BNUZ-ACM-GDCPC选拔赛 CodeForces 812B Sagheer, the Hausmeister【补】

B. Sagheer, the Hausmeistertime limit per test 1 secondmemory limit per test 256 megabytesinput stan...
  • qq_40731186
  • qq_40731186
  • 2018-04-16 22:28:43
  • 11

Codeforces Round #367 (Div. 2) 题解

题目链接:http://codeforces.com/contest/706 感想:唯一一次前四道题全部都有思路,而且能保证正确的一次CF。但是最后却只A了前两道水题,最后没能来得及写后...
  • Silenceneo
  • Silenceneo
  • 2016-08-12 10:01:04
  • 511
收藏助手
不良信息举报
您举报文章:CodeForces - 812B 补 题解
举报原因:
原因补充:

(最多只允许输入30个字)