11660번: 구간 합 구하기 5
첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네
www.acmicpc.net
사각형의 넓이를 다루듯이 풀면 쉽게 풀 수 있다. dp를 구할 때에도 왼쪽, 위의 dp값에서 왼쪽 위 대각선의 dp값을 빼고 현재 위치에 있는 수를 더하면 dp를 구할 수 있다.
답을 구할 때 사각형의 넓이를 구하듯이 전체에서 부분을 빼주고 교집합을 처리하는 식으로 구해주자.
#include <cstdio>
int main(void){
int N, M, x1, x2, y1, y2;
scanf("%d %d", &N, &M);
int array[N+1][N+1]={};
int dp[N+1][N+1]={};
for(int i=1; i<=N; i++){
for(int j=1; j<=N; j++){
scanf("%d", &array[i][j]);
dp[i][j] = (dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + array[i][j]);
}
}
for(int i=0; i<M; i++){
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
printf("%d\n", dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1]);
}
}
'알고리즘 문제' 카테고리의 다른 글
[C/C++ 백준 5904번] Moo 게임 (Silver 2) (0) | 2020.09.08 |
---|---|
[C/C++ 백준 1780번] 종이의 개수 (Silver 2) (0) | 2020.09.08 |
[C/C++ 백준 15665번] N과 M (11) (Silver 2) (0) | 2020.09.06 |
[C/C++ 백준 15664번] N과 M (10) (Silver 2) (0) | 2020.09.06 |
[C/C++ 백준 15663번] N과 M (9) (Silver 2) (0) | 2020.09.06 |