https://www.acmicpc.net/problem/2167





풀이



문제 설명이 구체적으로 되어있지 않아서 헤맸다.


ex)

arr[1][1]    arr[1][2]    arr[1][3]    arr[1][4]

arr[2][1]    arr[2][2]    arr[2][3]    arr[2][4]

arr[3][1]    arr[3][2]    arr[3][3]    arr[3][4]        와 같은 2차원 배열이 존재한다고 하고


문제를 이해하기로는 



i,j,x,y에 2,2,3,3을 주면

arr[1][1]    arr[1][2]    arr[1][3]    arr[1][4]

arr[2][1]    arr[2][2]    arr[2][3]    arr[2][4]

arr[3][1]    arr[3][2]    arr[3][3]    arr[3][4]    <-- 빨간 부분의 배열의 총 합을 구하는 거라고 생각했지만 X



arr[1][1]    arr[1][2]    arr[1][3]    arr[1][4]

arr[2][1]    arr[2][2]    arr[2][3]    arr[2][4]

arr[3][1]    arr[3][2]    arr[3][3]    arr[3][4]   <-- 이와 같이 사각형의 형태의 배열의 총 합을 구하는 문제였다.




그래서 나는 dp[i][j]를 이용해서 arr[1][1] 부터 arr[i][j]까지  총합을 구했다.


for (int i = 1; i <= N; i++) {

dp[i][1] = arr[i][1] + dp[i - 1][M];

for (int j = 2; j <= M; j++) {

dp[i][j] += dp[i][j-1] + arr[i][j];

}

}



그후에  x좌표의 값을 기준으로 for문을 이용해 이전에 구해 놓았던 dp값을 활용해서 한줄씩 부분 배열의 합을 구하기로 한다.


for (int i = 1; i <= T; i++) {

scanf("%d %d %d %d", &a, &b, &x, &y);

for (a; a <= x; a++) {

r += dp[a][y] - dp[a][b]+ arr[a][b];

}

printf("%d\n", r);

r = 0;

}


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
34
35
36
37
38
39
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
int main() {
    int arr[301][301= { 0 };
    int dp[301][301= { 0 };
    int N, M, T;
    int a, b, x, y;
    int r = 0;
 
    scanf("%d %d"&N, &M);
    
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            scanf("%d"&arr[i][j]);
        }
    }
 
    for (int i = 1; i <= N; i++) {
        dp[i][1= arr[i][1+ dp[i - 1][M];
        for (int j = 2; j <= M; j++) {
            dp[i][j] += dp[i][j-1+ arr[i][j];
        }
        
    }
 
    scanf("%d"&T);
 
    for (int i = 1; i <= T; i++) {
        scanf("%d %d %d %d"&a, &b, &x, &y);
        for (a; a <= x; a++) {
            r += dp[a][y] - dp[a][b]+ arr[a][b];
        }
        printf("%d\n", r);
        r = 0;
    }
 
    return 0;
}
cs


'알고리즘' 카테고리의 다른 글

(2294)(DP) 백준 동전2  (0) 2018.08.01
(11057)(DP) 백준 오르막 수  (0) 2018.07.30
(9461)(DP) 파도반 수열  (0) 2018.07.30
(9465)(DP) 백준 스티커  (0) 2018.07.30
(2293)(DP) 백준 동전1  (0) 2018.07.23

+ Recent posts