건포도
면접 대비시간 제한3초메모리 제한128 MB
N×M 초콜릿을 직선으로 잘라 1×1 조각으로 나눌 때, 자르는 조각에 든 건포도 수만큼 비용을 지불하므로 총 지불량을 최소로 만드는 값을 구한다.
문제
플로브디브의 유명한 초콜릿 가공업자 Bonny는 가로 칸, 세로 칸의 격자로 이루어진 크기의 건포도 초콜릿을 만들었다. 각 칸에는 건포도가 최소 1개 이상 들어 있으며, 두 칸 이상에 걸쳐 있는 건포도는 없다.
처음에 초콜릿은 하나의 커다란 블록이며, Bonny는 이것을 개의 조각으로 모두 나누어야 한다. 이 일은 욕심쟁이 Peter가 맡는다. Peter는 한 번에 하나의 직사각형 조각을 가로 또는 세로 방향의 직선을 따라 두 조각으로 자를 수 있고, 자를 때마다 보상을 요구한다.
Bonny는 돈이 없어 건포도로 보상을 지불한다. Peter의 조건은 이렇다: 직사각형 조각 하나를 두 조각으로 자를 때마다, 자르기 직전 그 조각에 들어 있던 건포도의 총 개수만큼을 받는다. 어떤 조각을 어떤 위치에서 자를지는 모두 Bonny가 정할 수 있다.
각 칸에 들어 있는 건포도의 개수가 주어질 때, 모든 칸을 조각으로 나누기 위해 Bonny가 지불해야 하는 건포도 개수의 최솟값을 구하여라.
입력
- 첫째 줄에 초콜릿의 크기 과 이 주어진다.
- 이어지는 개의 줄에는 각각 개의 정수 가 주어진다. 는 행 열 칸에 들어 있는 건포도의 개수이다.
출력
Bonny가 지불해야 하는 건포도 개수의 최솟값을 한 줄에 출력한다.
힌트
이 문제는 부분 직사각형에 대한 구간 동적 계획법으로 풀 수 있다. 한 직사각형 조각을 한 번 자르는 비용은 그 조각에 들어 있는 건포도의 총합이고, 잘린 두 조각은 서로 독립적으로 다시 나눌 수 있다. 따라서 크기가 작은 직사각형부터 '완전히 조각으로 나누는 최소 비용'을 차례로 채워 나가면 전체 답을 구할 수 있다.