격자 이동 3
\(N\)행 \(M\)열의 격자가 있다. 각 칸에는 정수가 하나씩 적혀 있다.
왼쪽 위 칸인 \((1,1)\)에서 출발하여 오른쪽 아래 칸인 \((N,M)\)까지 이동하려고 한다. 현재 칸에서 다음 세 방향 중 하나로 이동할 수 있다.
- 오른쪽: \((r,c)\)에서 \((r,c+1)\)로 이동한다.
- 아래쪽: \((r,c)\)에서 \((r+1,c)\)로 이동한다.
- 오른쪽 아래 대각선: \((r,c)\)에서 \((r+1,c+1)\)로 이동한다.
격자 밖으로 이동할 수 없다. 경로에 포함된 모든 칸의 값을 더했을 때 얻을 수 있는 합의 최댓값을 구하여라. 시작 칸과 도착 칸의 값도 합에 포함한다.
입력
첫째 줄에 격자의 행의 수 \(N\)과 열의 수 \(M\)이 공백으로 구분되어 주어진다.
다음 \(N\)개의 줄에 걸쳐 격자에 적힌 정수가 주어진다. 이 중 \(i\)번째 줄의 \(j\)번째 정수는 \((i,j)\)에 적힌 값 \(A_{i,j}\)이다.
출력
가능한 경로에서 얻을 수 있는 합의 최댓값을 출력한다.
제한
- \(1 \le N,M \le 1,000\)
- \(-1,000 \le A_{i,j} \le 1,000\)
- 입력으로 주어지는 값은 모두 정수이다.
예제 입력
3 3
1 -100 3
-100 10 -100
3 -100 20
예제 출력
31
두 번의 오른쪽 아래 대각선 이동으로 값이 \(1\), \(10\), \(20\)인 칸을 지나면 합은 \(31\)이다.
코멘트