일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 2021
- mmdetection
- 알고리즘
- 파이썬 강좌
- 파이썬 강의
- dp
- 라즈베리파이3
- 계획
- 자작시
- 슬픔
- dynamic programming
- mmcv
- 백준
- python 강좌
- 다이나믹프로그래밍
- BOJ
- 강좌
- 2020
- 머신러닝
- python 강의
- python
- 철학
- 파이썬
- 공부
- 라즈베리파이 모니터
- 강의
- 라즈베리파이
- C++
- 프로그래밍
- it
Archives
- Today
- Total
Stargazer
[백준] 11660번: 구간 합 구하기 5 C++ 풀이 본문
반응형
접근:
일반적으로 계산하면 시간 초과가 뜨는 문제이다.
반복적으로 더해주는 작업을 하는 것이기 때문에
DP로 접근하여서 푸는 것이 적절해 보인다.
전략:
구간 합을 입력 받을 때 마다 (0,0) 부터 (x2,y2)를 구해주어 2차원 배열로 저장하고,
구간 합이 주어지면 구해준 구간 합의 조합{(0,0) ~ (x2,y2)}으로 해결해주면 된다.
(x1 - 1 , y1 - 1) | (x1 - 1, y2) |
(x2 , y1 - 1) | (x2 , y2) |
구하고자 하는 값이 (x1,y1)부터 (x2,y2) 까지의 구간 합 이므로,
(x2, y2) - (x1-1 ,y2) - (x2 ,y1-1) + (x1 - 1 , y1 - 1) 이런식으로 구해준 값으로 겹치는 영역을 빼고 더해주면
원하는 구간의 값이 나온다.
구현:
#include <iostream>
#define SIZE 1025
using namespace std;
int n,m ;
int summap[SIZE][SIZE];
int x[2],y[2];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >>n >> m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int tmp;
cin >> tmp;
summap[i][j] = summap[i][j-1] +summap[i-1][j] - summap[i-1][j-1] +tmp;
}
}
for(int i=0;i<m;i++){
for(int j=0;j<2;j++){
cin >> x[j] >> y[j];
}
int sum =0;
sum = summap[x[1]][y[1]] - summap[x[1]][y[0]-1] - summap[x[0]-1][y[1]] + summap[x[0]-1][y[0]-1];
cout << sum << '\n';
}
return 0;
}
반응형
'Undergraudate basics(학부생 기초) > 자료구조, 알고리즘' 카테고리의 다른 글
[백준] 9465번: 스티커 C++ 풀이 (DP) (0) | 2022.05.13 |
---|---|
[백준] 1991번: 트리순회 C++ 풀이 (0) | 2022.05.13 |
[백준] 11404번: 플로이드 C++ 풀이 (0) | 2022.05.11 |
[백준] 12865번: 평범한 배낭 C++ (0) | 2022.05.11 |
[백준] 13549번 : 숨바꼭질 3 C++ 풀이 (0) | 2022.05.10 |
Comments