[백준] 25708: 만남의 광장 - JAVA
in Algorithm on 브루트포스 알고리즘
https://www.acmicpc.net/problem/25708
풀이
길을 가로 2개, 세로 2개 만들어야 한다.
가로와 세로 각각 누적합을 만들어놓았다.
4중for문을 통해 up, down, left, right 를 탐색하여 구해놓은 누적합을 더해주고
겹치는 부분을 원 배열에서 찾아 빼주었다.
길로 둘러쌓인 부분의 개수를 더해야 하므로 (down-up-1)*(right-left-1)만큼 더해주었다.
메모리: 16892KB
시간: 312ms
언어: Java 11
코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] board = new int[n][m];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
int[] rowSum = new int[n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
rowSum[i] += board[i][j];
}
}
int[] colSum = new int[m];
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) {
colSum[j] += board[i][j];
}
}
int ans = Integer.MIN_VALUE;
for (int up = 0; up < n; up++) {
for (int down = up + 1; down < n; down++) {
for (int left = 0; left < m; left++) {
for (int right = left + 1; right < m; right++) {
int sum = rowSum[up] + rowSum[down] + colSum[left] + colSum[right];
sum -= (board[up][left] + board[up][right] + board[down][left] + board[down][right]);
sum += (down - up - 1) * (right - left - 1);
ans = Math.max(ans, sum);
}
}
}
}
System.out.println(ans);
}
}