
#풀이
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] matrix = new int[1025][1025];
int[][] dp = new int[1025][1025];
for(int i = 1; i<=N; i++){
st = new StringTokenizer(br.readLine());
for(int j = 1; j<=N; j++){
matrix[i][j] = Integer.parseInt(st.nextToken());
dp[i][j] = matrix[i][j]+dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1];
}
}
int y1,y2,x1,x2;
for(int i = 0; i<M; i++){
st = new StringTokenizer(br.readLine());
y1 = Integer.parseInt(st.nextToken());
x1 = Integer.parseInt(st.nextToken());
y2 = Integer.parseInt(st.nextToken());
x2 = Integer.parseInt(st.nextToken());
bw.write(dp[y2][x2]+dp[y1-1][x1-1]-dp[y2][x1-1]-dp[y1-1][x2]+"\n");
}
bw.flush();
}
}
#성능

#정리
처음 풀때는 일일이 다 탐색해서 더하는 방법으로 하여 시간초과가 났다.
이 경우, 최대 맵 크기(NxN) 내에서 모두 탐색하면서 연산 횟수(M) 만큼 계산하게 되면 1,024 x 1,024 x 100,000(최악의 경우) 으로 문제를 풀지 못하게 된다.
따라서 나는 DP로 해당문제를 풀었다.
// dp[i][j] = (1,1)부터 (i,j)까지의 누적합
DP의 점화식은 다음과 같다.
dp[i][j] = matrix[i][j]
+ dp[i-1][j] // 위쪽 영역
+ dp[i][j-1] // 왼쪽 영역
- dp[i-1][j-1]; // 중복된 왼쪽 위 영역 제거
부분합 계산식은 다음과 같다.
sum = dp[y2][x2]
- dp[y1-1][x2]
- dp[y2][x1-1]
+ dp[y1-1][x1-1];
'PS' 카테고리의 다른 글
[백준] 1932번 : 정수 삼각형[Java] (2) | 2025.07.10 |
---|---|
[백준] 12865번 : 평범한 배낭[Java] (1) | 2025.07.10 |
[백준] 16953번 : A->B[Java] (3) | 2025.07.09 |
[백준] 11053번 : 가장 긴 증가하는 부분 수열[Java] (0) | 2025.07.08 |
[백준] 15666번 : N과 M (12)[Java] (0) | 2025.07.08 |