만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

최대 부분 행렬 합

면접 대비

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

요약
N×M 정수 행렬에서 연속된 직사각형 부분행렬의 합이 가장 큰 값을 구합니다. 빈 부분행렬도 허용됩니다.
난이도

보통10점 중 5점

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

문제

N×MN \times M 크기의 행렬 AA가 주어진다. 이 행렬에서 부분 직사각형 행렬의 합이 가장 큰 값을 구하라.

여기서 부분 직사각형 행렬은 행렬 AA에서 직사각형 영역을 골라 얻은 연속된 부분 행렬이다. 두 쌍의 인덱스 (r1,c1)(r_1, c_1)와 (r2,c2)(r_2, c_2) 사이에 있는 모든 행과 열을 포함한다. 단, 1≤r1≤r2≤N1 \le r_1 \le r_2 \le N이고 1≤c1≤c2≤M1 \le c_1 \le c_2 \le M이다. 빈 부분 행렬도 허용한다.

입력

입력의 첫 줄에 행렬의 크기를 나타내는 공백으로 구분된 정수 NN과 MM이 주어진다. (1≤N≤M≤100 000;1 \le N \le M \le 100\,000; 1≤NM≤100 0001 \le NM \le 100\,000)

이어지는 NN개의 줄에는 각 줄마다 공백으로 구분된 MM개의 정수로 행렬의 값이 주어진다. ii번째 줄의 jj번째 정수가 AijA_{ij}이다. (−10 000≤Aij≤10 000-10\,000 \le A_{ij} \le 10\,000)

출력

부분 직사각형 행렬의 합의 최댓값을 한 줄에 출력한다.

힌트

(서강대 학생을 위한 안내입니다.) 이 문제는 일반 프로그래밍 대회 형식에 맞추어 변형한 문제이다. 시험에서의 원래 배점은 다음과 같았다.

  • 부분문제 1: 3535점.
  • 부분문제 2: 2525점.
  • 부분문제 3: 3535점.
  • 부분문제 4: 55점.

예제1

  1. 예제 1

    입력
    4 5
    1 2 -1 -4 -20
    -8 -3 4 2 1
    3 8 10 1 3
    -4 -1 1 7 -6
    
    예상 출력
    29