ps:problems:boj:11873
최대 직사각형
| ps | |
|---|---|
| 링크 | acmicpc.net/… |
| 출처 | BOJ |
| 문제 번호 | 11873 |
| 문제명 | 최대 직사각형 |
| 레벨 | 플래티넘 3 |
| 분류 |
부분그리드 |
| 시간복잡도 | O(T*n*m) |
| 인풋사이즈 | T<=?, n<=1000, m<=1000 |
| 사용한 언어 | Python 3.13 |
| 제출기록 | 49728KB / 4764ms |
| 최고기록 | 4736ms |
| 해결날짜 | 2026/03/04 |
풀이
- O(m)의 '히스토그램에서 가장 큰 직사각형 찾기'를 1행~i행 까지로 만든 누적합 배열에 n번 적용하는 방식으로 O(n*m)에 풀수 있다.
코드
"""Solution code for "BOJ 11873. 최대 직사각형".
- Problem link: https://www.acmicpc.net/problem/11873
- Solution link: http://www.teferi.net/ps/problems/boj/11873
Tags: [nge]
"""
import sys
from teflib import seqtask
END_OF_INPUT = '0 0'
def main():
while (line := sys.stdin.readline().rstrip()) != END_OF_INPUT:
N, M = [int(x) for x in line.split()]
grid = [sys.stdin.readline().split() for _ in range(N)]
answer = 0
heights = [0] * M
for row in grid:
for i, x in enumerate(row):
heights[i] = 0 if x == '0' else heights[i] + 1
begs, ends = seqtask.max_ranges_for_each_min(heights)
max_area = max(h * (e - b) for h, b, e in zip(heights, begs, ends))
answer = max(max_area, answer)
print(answer)
if __name__ == '__main__':
main()
- Dependency: teflib.seqtask.max_ranges_for_each_min
ps/problems/boj/11873.txt · 마지막으로 수정됨: 2026/03/04 14:14 저자 teferi

토론