N×N개의 수가 N×N 크기의 표에 채워져 있다. (x1, y1)부터 (x2, y2)까지 합을 구하는 프로그램을 작성하시오. (x, y)는 x행 y열을 의미한다.
예를 들어, N = 4이고, 표가 아래와 같이 채워져 있는 경우를 살펴보자.
| 1 | 2 | 3 | 4 |
| 2 | 3 | 4 | 5 |
| 3 | 4 | 5 | 6 |
| 4 | 5 | 6 | 7 |
여기서 (2, 2)부터 (3, 4)까지 합을 구하면 3+4+5+4+5+6 = 27이고, (4, 4)부터 (4, 4)까지 합을 구하면 7이다.
표에 채워져 있는 수와 합을 구하는 연산이 주어졌을 때, 이를 처리하는 프로그램을 작성하시오.
직사각형 상에서 두 구간합과 해당 칸의 조합으로 또 다른 구간합을 구할 수 있다는 기하학적 해석이 중요한 문제. 이는 dp배열의 점화식으로 치환이 가능하다.
#include<iostream>
#define Max 1025
using namespace std;
int N, M, cnt;
int arr[Max][Max];
int dp[Max][Max];//첫 번째 값 부터 i, j 까지의 직사각형 내의서의 합
void init(){
ios_base :: sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
int main(){
init();
cin>>N>>M;
for(int i=1; i<=N; i++){
for(int j=1; j<=N; j++){
cin>>arr[i][j];
dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+arr[i][j];
}
} int x1, y1, x2, y2, ans;
for(int i=0; i<M; i++){
cin>>x1>>y1>>x2>>y2;
ans=dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1];
cout<<ans<<"\n";
}
}'알고리즘' 카테고리의 다른 글
| Boj 1932 c++ 정수 삼각형 (0) | 2025.07.15 |
|---|---|
| Boj 15666 c++ N과 M(12) (0) | 2025.07.14 |
| Boj 12865 c++ 평범한 배낭 (1) | 2025.07.14 |
| Boj 11053 c++ 가장 긴 증가하는 부분수열 (2) | 2025.07.14 |
| Boj 1149 c++ RGB거리 (0) | 2025.07.14 |