레야몬
[C++] 11660번 구간 합 구하기 5 - DP, 누적 합 본문
#include <iostream>
#define MAX_SIZE 1025
using namespace std;
int N, M; //표의 크기 N, 합을 구해야 하는 횟수 M
int x1, y1, x2, y2;
int memo[MAX_SIZE][MAX_SIZE]; //메모리제이션 누적합
int map[MAX_SIZE][MAX_SIZE]; //맵
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
for(int i=1; i<=N; i++) {
int sum=0;
for(int j=1; j<=N; j++) {
cin >> map[i][j];
sum+=map[i][j];
memo[i][j] = memo[i-1][j]+sum; //(0, 0)에서 (x, y)까지의 누적합
}
}
for(int i=0; i<M; i++) {
cin >> x1 >> y1 >> x2 >> y2;
cout << memo[x2][y2]-memo[x2][y1-1]-memo[x1-1][y2]+memo[x1-1][y1-1] << '\n';
}
return 0;
}
생각해보니까 맨 처음에 메모저장할 때도 굳이 map을 쓸 필요가 없었던 것 같다. map을 쓰지 않고 (x1, y1)에서 (x2, y2)의 합 구하는 것 처럼 (0, 0)에서 (x1, y1)까지의 합을 구하면 더 빨리 나왓을 것 같은데. 아 그리고 새로 알게된 점은 endl은 느려서 쓰면 안된다는 것이었다. 이것때문에 시간 초과가 났었던 것이라고 한다.ㅋㅋㅋㅋ 참고한 사이트는 아래에 있다. 누적합은 처음 보는 거라서
<누적 합>
https://jow1025.tistory.com/47
누적합(prefix sum)
누적합은 말 그대로 구간의 누적합을 구하는 문제입니다. 일반적으로 사용되는 배열에 값을 저장하고 지정된 인덱스부터 하나씩 더해가는 방식은 최악의 경우O(n^2)의 시간복잡도를 갖기 때문에
jow1025.tistory.com
※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 12865번 평범한 배낭 - DP, 배낭 문제 (0) | 2022.09.05 |
---|---|
[C++] 11725번 트리의 부모 찾기 - 트리, DFS (0) | 2022.09.05 |
[C언어] 피보나치 수 6 - 수학, 분할 정복 (0) | 2022.09.05 |
[C++] 11404번 플로이드 - 플로이드-워셜 (0) | 2022.09.05 |
[C++] 11053번 가장 긴 증가하는 부분 수열 - DP (0) | 2022.09.04 |
Comments