※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 14925번 문제인 목장 건설하기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/14925
14925번: 목장 건설하기
랜드 씨는 퇴직금으로 땅을 사서 목장을 지으려 한다. 그가 사려고 소개받은 땅은 직사각형이고 대부분 들판이지만, 여기저기에 베기 어려운 나무와 치울 수 없는 바위가 있다. 그는 목장을 하
www.acmicpc.net
dp[r][c]를 "r행 c열을 가장 오른쪽 아래 칸으로 갖는 가장 큰 정사각형의 한 변의 길이"로 하면 해당 칸이 빈 칸인 경우 다음과 같은 식이 성립합을 관찰할 수 있다.
dp[r][c] = min(dp[r-1][c-1], dp[r-1][c], dp[r][c-1]) + 1
빈 종이등에 정사각형들을 직접 그려보면 위 식의 이해가 쉬울 것이다.
물론 해당 칸에 나무나 바위가 있다면 dp[r][c] = 0이 된다.
위의 점화식과 메모이제이션을 이용하여 문제를 빠르게 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int R, C;
int ans = 0;
int dp[1001][1001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> R >> C;
for (int r = 1; r <= R; r++) {
for (int c = 1; c <= C; c++) {
int x; cin >> x;
if (x > 0) continue;
int tmp = min(dp[r - 1][c - 1], min(dp[r - 1][c], dp[r][c - 1])) + 1;
dp[r][c] = tmp;
ans = max(ans, tmp);
}
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 14927 // C++] 전구 끄기 (0) | 2022.04.24 |
---|---|
[BOJ 14924 // C++] 폰 노이만과 파리 (0) | 2022.04.24 |
[BOJ 14918 // C++] 더하기 (0) | 2022.04.24 |
[BOJ 14923 // C++] 미로 탈출 (0) | 2022.04.24 |
[BOJ 14920 // C++] 3n+1 수열 (0) | 2022.04.24 |