다이나믹 프로그래밍 , 누적합
점화식이 떠오르지 않아서 풀이를 보며 공부했다.
dp[i][j]를 구하는 점화식은
dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+arr[i][j]
이다.
그리고 주어진 x1, y1, x2, y2 좌표에서
해당 범위 내의 누적합을 구하는 공식은
num = dp[x2][y2] - dp[x2][y1-1] - dp[x1-1][y2] + dp[x1-1][y1-1]
이다.
이 점화식을 풀이를 1번 보고 이해한 후
이해한 것을 바탕으로 풀이를 보지 않고 그림 그려가며 범위를 구하며 코딩했다.
import java.util.*;
import java.io.*;
public class Main {
static int arr[][];
static int dp[][];
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb=new StringBuilder();
StringTokenizer st;
st=new StringTokenizer(br.readLine());
int N=Integer.parseInt(st.nextToken());
int M=Integer.parseInt(st.nextToken());
arr=new int[N+1][N+1];
dp=new int[N+1][N+1];
for(int i=1;i<=N;i++) {
st=new StringTokenizer(br.readLine());
for(int j=1;j<=N;j++) {
arr[i][j]=Integer.parseInt(st.nextToken());
}
}
for(int i=1;i<dp.length;i++) {
for(int j=1;j<dp.length;j++) {
dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+arr[i][j];
}
}
for(int i=0;i<M;i++) {
st=new StringTokenizer(br.readLine());
int x1=Integer.parseInt(st.nextToken());
int y1=Integer.parseInt(st.nextToken());
int x2=Integer.parseInt(st.nextToken());
int y2=Integer.parseInt(st.nextToken());
int num = dp[x2][y2] - dp[x2][y1-1] - dp[x1-1][y2] + dp[x1-1][y1-1];
sb.append(num).append('\n');
}
System.out.println(sb);
}
}
dp 는 내겐 너무 어렵다.
dp 까지만 잘해지고 싶다..
하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212