본문 바로가기

백준/백준

[백준 2167 ] 2차원 배열의 합

문제    www.acmicpc.net/problem/2167




풀이


( 1 ) DP 정의하기


dp[i][j] = (0,0) ~ (i,j) 까지 배열들의 합 

- dp[0][j] = 0

- dp[i][0] = 0


 dp[0][0]


 

 

 


 

 

 

 

 


 



 

 dp[2][2]

 

 

 

 

 

 

 


 

 

 

 

 





(2) DP 입력하기

dp[i][j] = value[i][j] +  dp[i-1][j] + dp[i][j-1] + dp[i-1][j-1] 




 

 

 


 

 

 

 

 


 



 

 dp[i-1][j-1]

 dp[i-1][j]

 

 

 

 dp[i][j-1]

 dp[i][j] 

(value[i][j])

 


 

 

 

 

 




(3) ( i, j ) ~ ( x, y ) 출력하기


ouput = dp[x][y] - ( dp[x][j-1] + dp[i-1][y] - dp[i-1][j-1] )  

// dp[i-1][j-1] 은 중복해서 제거되므로 다시 추가. 



( 0 , 0 )



 

 


 

dp[i-1][j-1] 

 

dp[i-1][y] 

 


 



 

( i , j )

  

 

 dp[x][j-1]

 

( x, y )

 dp[x][y] 

 


 

 

 

 

 ( N , M )




코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* BJ 2167 - 2차원 배열의 합
 *  Coded by Handal ( 2019.02 )
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
    static BufferedReader brr = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer stt;
    public static void main(String[] args) throws IOException {
        stt = new StringTokenizer(brr.readLine());
        int N = Integer.parseInt(stt.nextToken());
        int M = Integer.parseInt(stt.nextToken());
        int[][] dp = new int[N + 1][M + 1];
        for (int i = 1; i <= N; i++) {
            stt = new StringTokenizer(brr.readLine());
            for (int j = 1; j <= M; j++)
                dp[i][j] = Integer.parseInt(stt.nextToken()) + dp[i-1][j] + dp[i][j-1- dp[i-1][j-1] ;
        }
        int K = Integer.parseInt(brr.readLine());
        while (K-- > 0) {
            stt = new StringTokenizer(brr.readLine());
            int i = Integer.parseInt(stt.nextToken());
            int j = Integer.parseInt(stt.nextToken());
            int x = Integer.parseInt(stt.nextToken());
            int y = Integer.parseInt(stt.nextToken());
            System.out.println(dp[x][y] - dp[i - 1][y] - dp[x][j - 1+ dp[i - 1][j - 1]);
        }
    }
}
 
cs




'백준 > 백준' 카테고리의 다른 글

[ 백준 1978 ] 소수 찾기  (0) 2019.11.03
[ 백준 9465 ] 스티커  (0) 2019.11.02
[ 백준 1002 ] 터렛  (0) 2019.11.01
[백준 1780] 종이의 개수  (0) 2019.02.09
[백준 1992] 쿼드트리  (0) 2019.02.08