|
| 1 | +""" |
| 2 | +https://www.acmicpc.net/problem/1520 |
| 3 | +""" |
| 4 | + |
| 5 | +import sys |
| 6 | +input = sys.stdin.readline |
| 7 | +#0. 맵 (N,M) 칸 별 탐사 가치 설정 |
| 8 | +N , M = map(int,input().split()) # y,x |
| 9 | +fields =list() |
| 10 | +for n in range(N) : |
| 11 | + fields.append(list(map(int, input().split()))) |
| 12 | + |
| 13 | +# print(fields) |
| 14 | +# 2. dp 테이블 초기화 |
| 15 | +dp = [[0 for _ in range(M)] for k in range(N)] |
| 16 | +left2right = [[0 for _ in range(M)] for k in range(N)] |
| 17 | +right2left = [[0 for _ in range(M)] for k in range(N)] |
| 18 | +#3.탐색 가능 (1)left2 right <-/ (2) right2left <- |
| 19 | + |
| 20 | + # n == 0 경우 : (1) left2right 경로만 존재(누적값) |
| 21 | +for m in range(M) : |
| 22 | + dp[0][m] = dp[0][m-1] + fields[0][m] |
| 23 | +# 2번쨰 행 부터 진행 |
| 24 | +for n in range(1, N) : |
| 25 | + #m==0인 경우 초기화 : top-dowm의 경로만 존재 |
| 26 | + left2right[n][0] = dp[n-1][0] + fields[n][0] |
| 27 | + right2left[n][M-1] = dp[n-1][M-1] + fields[n][M-1] |
| 28 | + # 1. 왼쪽 -> 오른쪽 방향으로 탐색 진행 |
| 29 | + for m in range(1,M) : |
| 30 | + # (1)left2right , top-down 방향 탐색 누적 값 구하기 |
| 31 | + left2right[n][m] = max(dp[n-1][m], left2right[n][m-1])+ fields[n][m] |
| 32 | + |
| 33 | + #2. 오른쪽 -> 왼쪽 방향으로 탐색 진행 |
| 34 | + for m in range(M-2 , -1 , -1) : |
| 35 | + # (2) right2left , top-down 방향 누적값 구하기 |
| 36 | + right2left[n][m] = max(dp[n-1][m], right2left[n][m+1])+ fields[n][m] |
| 37 | + #3. 열 m 탐색 완료시 , 최종 dp 값 계산하기 |
| 38 | + for m in range(M): |
| 39 | + dp[n][m] = max(left2right[n][m] , right2left[n][m]) |
| 40 | + |
| 41 | +print(dp[-1][-1]) |
0 commit comments