누적합이란
누적된 합을 담고있는 배열을 이용해 요소들의 합을 빠르게 구하는 방법
왜 씀?
11659번: 구간 합 구하기 4 (acmicpc.net)
이 문제를 예시로 보자.
N개의 숫자가 주어지고,
이 N개의 숫자 배열의 특정구간 i부터 j번째 수까지 합을 M번 구해야한다.
N과 M 모두 1부터 100000 사이 수이므로, ]
단순히 for문을 써서 배열의 숫자를 하나씩 sum변수에 더해가는 구현은 O(N^2)의 시간복잡도가 발생한다.
그런데 이를 누적합 배열을 이용한다면 O(N)으로 구현이 가능하다.
누적합 배열의 각 요소는 i번째 수까지의 합을 의미하기 때문에,
누적합 배열의 요소를 미리 설정해놓고
i번째수 까지의 합을 찾을땐 그냥 누적합 배열에 바로 접근하면 된다.
#include<iostream>
#include<algorithm>
#define MAX 100000
using namespace std;
int N,M;
int psum[MAX+1];
int main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> N >> M;
for(int i = 1; i < N+1; i++){
cin >> psum[i];
psum[i] += psum[i-1];
}
int p,q;
for(int i = 0; i < M; i++){
cin >> p >> q;
cout << psum[q]-psum[p-1] << '\n';
}
return 0;
}
'개발 > 알고리즘' 카테고리의 다른 글
최장 증가 부분 수열, LIS 알고리즘 (0) | 2024.05.14 |
---|---|
동적계획법, Dynamic programming (0) | 2024.04.05 |
c++) 백준 14888 백트래킹, 연산자 끼워넣기 (0) | 2024.03.25 |
백트래킹(Backtracking) 알고리즘 (1) | 2024.03.24 |
c++ 하노이의 탑, 재귀함수, 백준 11729 (2) | 2024.03.22 |