아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

행렬분할 2

시간 제한2초메모리 제한1024 MB

요약
n×m 행렬에서 가로 a번, 세로 b번 자를 위치를 정해 생기는 조각들의 합 중 최댓값이 최소가 되도록 할 때 그 최솟값을 구한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 누적 합, 이분 탐색, 행렬
정답자
아직 제출이 없습니다

문제

n×mn \times m 크기의 행렬이 있다. 이 행렬을 가로로 aa번, 세로로 bb번 잘라 (a+1)×(b+1)(a + 1) \times (b + 1) 개의 부분으로 분할하려고 한다. 이때 같은 부분을 두 번 이상 자를 수는 없다. 즉, 한 개의 원소도 포함하지 않는 부분은 존재할 수 없다.

그림 1그림 2

그림 1과 같은 6×76 \times 7 행렬이 있을 때, 이 행렬을 가로로 2번, 세로로 3번 자르면 그림 2와 같이 된다.

분할의 '점수'는 잘라진 각 부분의 합들 중에서 가장 큰 값으로 정의한다. 예를 들어, 그림 2와 같은 분할에서의 점수는 색칠한 부분의 합인 19이다. 최소로 분할하면 점수는 15이고, 그림은 생략한다.

행렬이 주어졌을 때 가능한 최소 점수를 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 자연수 n(2≤n≤100)n(2 \le n \le 100)과 m(2≤m≤8)m(2 \le m \le 8)이 주어진다. 두 번째 줄에는 자연수 a(1≤a<n)a(1 \le a < n), b(1≤b<m)b(1 \le b < m)가 주어진다. 세 번째 줄부터 nn개의 줄에 걸쳐 행렬의 원소들이 공백으로 구분되어 주어진다. 행렬의 모든 원소는 100,000 이하의 자연수이다.

출력

첫 번째 줄에 최소 점수를 출력한다.

예제1

  1. 예제 1

    입력
    6 7
    2 3
    4 1 3 4 2 1 2
    1 2 2 5 7 1 4
    1 5 4 2 8 2 3
    2 1 1 2 2 2 6
    3 3 3 2 4 1 7
    1 1 4 7 6 1 1
    
    예상 출력
    15