알고리즘/동적프로그래밍(DP)

[백준] 11660번: 구간 합 구하기 5 - java

아뵹젼 2023. 2. 4.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static long mod = 1000000000;

	public static void main(String[] args) throws IOException {
		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[][] 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++) {
				dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + Integer.parseInt(st.nextToken());
			}
		}
		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 answer = dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1];
			System.out.println(answer);
		}

	}

}

 

dp[i][j] => (1,1) 부터 (i,j) 까지의 합을 의미한다.

1,1~n,n 까지 dp값을 갱신할 수 있다.

 

따라서 표의 값을 입력받음과 동시에 dp[i][j] 값을 갱신해주었다.

dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + 입력받은(i,j)값

그림을 그려본다면 위와 같은 점화식을 쉽게 구할 수 있다.

 

 

 

그렇다면 (x1,y1) ~ (x2,y2) 까지의 합은 어떻게 구할까?

마찬가지로 그림을 그려본다면 점화식을 비교적 쉽게 구할 수 있을 것이다.

구하고자 하는 부분 합 = dp[x2][y2] - dp[x2][y1-1] - dp[x1-1][y2] + dp[x1-1][y1-1]

 

댓글