dp로 풀었다. O(NM)
입력차례대로 위칸과 왼쪽칸과 왼쪽위 대각선 칸을 비교해서 가장 작은값 + 1로 새로운 정사각형을 만들 수 있다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
/** | |
* https://www.acmicpc.net/problem/14925 | |
* BOJ 백준온라인져지 14925 목장 건설하기 풀이 | |
*/ | |
int min(int a, int b){ | |
return a < b ? a : b; | |
} | |
int max(int a, int b){ | |
return a > b ? a : b; | |
} | |
int main(){ | |
int rowSize, columnSize, result = 0; | |
scanf("%d%d", &rowSize, &columnSize); | |
rowSize++, columnSize++; | |
bool **map = new bool*[rowSize]; | |
int **dp = new int*[rowSize]; | |
for(int i = 0; i < rowSize; i++){ | |
map[i] = new bool[columnSize]; | |
map[i][0] = true; | |
dp[i] = new int[columnSize]; | |
} | |
for(int i = 0; i < columnSize; i++){ | |
map[0][i] = true; | |
} | |
for(int i = 1; i < rowSize; i++){ | |
for(int j = 1; j < columnSize; j++){ | |
dp[i][j] = 0; | |
int temp; | |
scanf("%d", &temp); | |
map[i][j] = temp == 0; | |
if(map[i][j]){ | |
dp[i][j] = 1; | |
int t = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])); | |
dp[i][j] = t + 1; | |
result = max(dp[i][j], result); | |
} | |
} | |
} | |
printf("%d", result); | |
} |
'IT > 알고리즘' 카테고리의 다른 글
BOJ 백준온라인져지 1005 ACM Craft 풀이 (0) | 2017.12.19 |
---|---|
BOJ 백준온라인져지 14926 Not Equal 풀이 (0) | 2017.12.17 |
BOJ 백준온라인져지 14924 폰 노이만과 파리 풀이 (0) | 2017.12.16 |
BOJ 백준온라인져지 2206 벽 부수고 이동하기 풀이 (0) | 2017.12.15 |
BOJ 백준온라인져지 14923 미로탈출 풀이 (0) | 2017.12.15 |