-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbaekjoon_2169.java
More file actions
87 lines (64 loc) · 2.58 KB
/
baekjoon_2169.java
File metadata and controls
87 lines (64 loc) · 2.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.io.*;
import java.util.*;
public class baekjoon_2169 {
static long[][] memo = new long[31][31];
static final int LEFT = 0, RIGHT = 1, DOWN = 2;
static int N, M;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
int[][][] dp = new int[N][M][4];
int[][] map = new int[N][M];
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine());
for(int j=0;j<M;j++) {
map[i][j] = Integer.parseInt(br.readLine());
}
}
dp[0][0][LEFT] = map[0][0];
dp[0][0][RIGHT] = map[0][0];
for(int i=1;i<M;i++) {
dp[0][i][LEFT] = dp[0][i-1][LEFT] + map[0][i];
dp[0][i][DOWN] = dp[0][i-1][DOWN] + map[0][i];
}
for(int i=1;i<N;i++) {
rightDir(dp, map, i);
leftDir(dp, map, i);
downDir(dp, map, i);
}
System.out.println(dp[N - 1][M - 1][DOWN]);
}
private static void rightDir(int[][][] dp, int[][] map, int row) {
//맨 왼쪽 첫칸은 바로 윗칸의 메모 값이랑 더하기
dp[row][0][RIGHT] = map[row][0] + dp[row - 1][0][DOWN];
for(int col=1;col<M;col++) {
if(dp[row][col-1][RIGHT] >= dp[row - 1][col][DOWN]){
dp[row][col][RIGHT] = dp[row][col-1][RIGHT] + map[row][col];
}
else {
dp[row][col][RIGHT] = dp[row - 1][col][DOWN] + map[row][col];
}
}
}
private static void leftDir(int[][][] dp, int[][] map, int row) {
//맨 오른쪽 첫칸은 바로 윗칸의 메모 값이랑 더하기
dp[row][M - 1][LEFT] = map[row][M - 1] + dp[row - 1][M - 1][DOWN];
//왼쪽으로 가면서 최대값 찾기
for(int col=M - 2;col>=0;col--) {
if(dp[row][col+1][LEFT] >= dp[row - 1][col][DOWN]){
dp[row][col][LEFT] = dp[row][col+1][RIGHT] + map[row][col];
}
else {
dp[row][col][LEFT] = dp[row - 1][col][DOWN] + map[row][col];
}
}
}
private static void downDir(int[][][] dp, int[][] map, int row) {
//왼쪽 방향 오른쪽 방향 둘다
for(int col=0;col<M;col++) {
dp[row][col][DOWN] = Math.max(dp[row][col][LEFT], dp[row][col][RIGHT]);
}
}
}