어흥

[백준 14925] 목장 건설하기 (C++) 본문

알고리즘/백준

[백준 14925] 목장 건설하기 (C++)

라이언납시오 2020. 5. 6. 15:51
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/14925

 

14925번: 목장 건설하기

랜드 씨는 퇴직금으로 땅을 사서 목장을 지으려 한다.  그가 사려고 소개받은 땅은 직사각형이고 대부분 들판이지만, 여기저기에 베기 어려운 나무와 치울 수 없는 바위가 있다. 그는 목장을 하나의 정사각형으로 최대한 크게 지으려 하는데, 그 안에 나무나 바위는 없어야 한다.  땅의 세로 길이가 M미터, 가로 길이가 N미터일 때, 1미터 간격의 격자로 된 땅의 지도를 M x N행렬로 표현하자.  이때, 행렬의 원소 0은 들판, 1은 나무 그리고 2는 돌을 의미

www.acmicpc.net

1. 주의할 점

- DP를 통해 해결한다

- 왼쪽, 위, 왼쪽위 대각선을 살핀다(처음엔 오랜쪽으로 했는데 바꿨다)

 

2. 구현

- 배열을 입력받을 때, 해당 배열의 원소가 0이면 해당 자리의 DP값을 왼쪽, 왼쪽위, 위와 비교하여 갱신한다

- 갱신된 DP값과 Maxi값을 비교하여 큰값을 Maxi에 할당한다

- Maxi를 출력한다

 

#define MAX 987654321
#include <iostream>
#include <algorithm>
using namespace std;
int arr[1001][1001];
int check[1001][1001];
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int row, col, maxi = 0;
	cin >> row >> col;
	for (int i = 1; i <= row; i++)
		for (int j = 1; j <= col; j++) {
			cin >> arr[i][j];
			check[i][j] = 0;
			if (arr[i][j] == 0) {
				int tt = MAX;
				tt = min(tt, check[i - 1][j]);
				tt = min(tt, check[i][j - 1]);
				tt = min(tt, check[i - 1][j - 1]);
				if (tt == MAX) tt = 0;
				check[i][j] = tt + 1;
				maxi = max(maxi, tt + 1);
			}
		}
	cout << maxi;
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1738] 골목길 (C++)  (0) 2020.05.07
[백준 6987] 월드컵 (Java)  (0) 2020.05.06
[백준 3108] 로고 (C++)  (2) 2020.05.06
[백준 9370] 미확인 도착지 (C++)  (0) 2020.05.06
[백준 1865] 웜홀 (C++)  (0) 2020.05.06
Comments