From 6a12b13af9deb7abe482637c63e23d6a74c10d27 Mon Sep 17 00:00:00 2001 From: llIllIllIllIllIllIllIllI <_@seol.pro> Date: Thu, 11 Dec 2025 23:49:33 +0900 Subject: [PATCH] =?UTF-8?q?[20251211]=20BOJ=20/=20G4=20/=20=EC=95=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=EC=A6=98=20=EC=88=98=EC=97=85=20-=20?= =?UTF-8?q?=ED=96=89=EB=A0=AC=20=EA=B2=BD=EB=A1=9C=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?4=20/=20=EC=84=A4=EC=A7=84=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...353\241\234 \353\254\270\354\240\234 4.md" | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 "Seol-JY/202512/11 BOJ G4 \354\225\214\352\263\240\353\246\254\354\246\230 \354\210\230\354\227\205 - \355\226\211\353\240\254 \352\262\275\353\241\234 \353\254\270\354\240\234 4.md" diff --git "a/Seol-JY/202512/11 BOJ G4 \354\225\214\352\263\240\353\246\254\354\246\230 \354\210\230\354\227\205 - \355\226\211\353\240\254 \352\262\275\353\241\234 \353\254\270\354\240\234 4.md" "b/Seol-JY/202512/11 BOJ G4 \354\225\214\352\263\240\353\246\254\354\246\230 \354\210\230\354\227\205 - \355\226\211\353\240\254 \352\262\275\353\241\234 \353\254\270\354\240\234 4.md" new file mode 100644 index 00000000..81308945 --- /dev/null +++ "b/Seol-JY/202512/11 BOJ G4 \354\225\214\352\263\240\353\246\254\354\246\230 \354\210\230\354\227\205 - \355\226\211\353\240\254 \352\262\275\353\241\234 \353\254\270\354\240\234 4.md" @@ -0,0 +1,62 @@ +```java +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine().trim()); + + int[][] m = new int[n + 1][n + 1]; + for (int i = 1; i <= n; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int j = 1; j <= n; j++) { + m[i][j] = Integer.parseInt(st.nextToken()); + } + } + + int p = Integer.parseInt(br.readLine().trim()); + int[][] points = new int[p][2]; + for (int i = 0; i < p; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + points[i][0] = Integer.parseInt(st.nextToken()); + points[i][1] = Integer.parseInt(st.nextToken()); + } + + long[][] fromStart = new long[n + 1][n + 1]; + for (int i = 0; i <= n; i++) Arrays.fill(fromStart[i], Long.MIN_VALUE); + fromStart[0][1] = 0; + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + long best = Long.MIN_VALUE; + if (fromStart[i - 1][j] != Long.MIN_VALUE) best = Math.max(best, fromStart[i - 1][j]); + if (fromStart[i][j - 1] != Long.MIN_VALUE) best = Math.max(best, fromStart[i][j - 1]); + if (best != Long.MIN_VALUE) fromStart[i][j] = best + m[i][j]; + } + } + + long[][] toEnd = new long[n + 2][n + 2]; + for (int i = 0; i <= n + 1; i++) Arrays.fill(toEnd[i], Long.MIN_VALUE); + toEnd[n + 1][n] = 0; + for (int i = n; i >= 1; i--) { + for (int j = n; j >= 1; j--) { + long best = Long.MIN_VALUE; + if (toEnd[i + 1][j] != Long.MIN_VALUE) best = Math.max(best, toEnd[i + 1][j]); + if (toEnd[i][j + 1] != Long.MIN_VALUE) best = Math.max(best, toEnd[i][j + 1]); + if (best != Long.MIN_VALUE) toEnd[i][j] = best + m[i][j]; + } + } + + long answer = Long.MIN_VALUE; + for (int i = 0; i < p; i++) { + int r = points[i][0]; + int c = points[i][1]; + if (fromStart[r][c] != Long.MIN_VALUE && toEnd[r][c] != Long.MIN_VALUE) { + answer = Math.max(answer, fromStart[r][c] + toEnd[r][c] - m[r][c]); + } + } + + System.out.println(answer); + } +} +```