Skip to content

Commit f96c08c

Browse files
authored
Merge pull request #1646 from AlgorithmWithGod/Seol-JY
[20251211] BOJ / G4 / 알고리즘 수업 - 행렬 경로 문제 4 / 설진영
2 parents c90e914 + 6a12b13 commit f96c08c

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
```java
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class Main {
6+
public static void main(String[] args) throws IOException {
7+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8+
int n = Integer.parseInt(br.readLine().trim());
9+
10+
int[][] m = new int[n + 1][n + 1];
11+
for (int i = 1; i <= n; i++) {
12+
StringTokenizer st = new StringTokenizer(br.readLine());
13+
for (int j = 1; j <= n; j++) {
14+
m[i][j] = Integer.parseInt(st.nextToken());
15+
}
16+
}
17+
18+
int p = Integer.parseInt(br.readLine().trim());
19+
int[][] points = new int[p][2];
20+
for (int i = 0; i < p; i++) {
21+
StringTokenizer st = new StringTokenizer(br.readLine());
22+
points[i][0] = Integer.parseInt(st.nextToken());
23+
points[i][1] = Integer.parseInt(st.nextToken());
24+
}
25+
26+
long[][] fromStart = new long[n + 1][n + 1];
27+
for (int i = 0; i <= n; i++) Arrays.fill(fromStart[i], Long.MIN_VALUE);
28+
fromStart[0][1] = 0;
29+
for (int i = 1; i <= n; i++) {
30+
for (int j = 1; j <= n; j++) {
31+
long best = Long.MIN_VALUE;
32+
if (fromStart[i - 1][j] != Long.MIN_VALUE) best = Math.max(best, fromStart[i - 1][j]);
33+
if (fromStart[i][j - 1] != Long.MIN_VALUE) best = Math.max(best, fromStart[i][j - 1]);
34+
if (best != Long.MIN_VALUE) fromStart[i][j] = best + m[i][j];
35+
}
36+
}
37+
38+
long[][] toEnd = new long[n + 2][n + 2];
39+
for (int i = 0; i <= n + 1; i++) Arrays.fill(toEnd[i], Long.MIN_VALUE);
40+
toEnd[n + 1][n] = 0;
41+
for (int i = n; i >= 1; i--) {
42+
for (int j = n; j >= 1; j--) {
43+
long best = Long.MIN_VALUE;
44+
if (toEnd[i + 1][j] != Long.MIN_VALUE) best = Math.max(best, toEnd[i + 1][j]);
45+
if (toEnd[i][j + 1] != Long.MIN_VALUE) best = Math.max(best, toEnd[i][j + 1]);
46+
if (best != Long.MIN_VALUE) toEnd[i][j] = best + m[i][j];
47+
}
48+
}
49+
50+
long answer = Long.MIN_VALUE;
51+
for (int i = 0; i < p; i++) {
52+
int r = points[i][0];
53+
int c = points[i][1];
54+
if (fromStart[r][c] != Long.MIN_VALUE && toEnd[r][c] != Long.MIN_VALUE) {
55+
answer = Math.max(answer, fromStart[r][c] + toEnd[r][c] - m[r][c]);
56+
}
57+
}
58+
59+
System.out.println(answer);
60+
}
61+
}
62+
```

0 commit comments

Comments
 (0)