-
백준 11441번 : 합 구하기다이나믹프로그래밍(DP) 2018. 6. 18. 14:50반응형
https://www.acmicpc.net/problem/11441
1. 문제
N개의 수 A1, A2, ..., AN이 입력으로 주어진다. 총 M개의 구간 i, j가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.
2. 알고리즘
키워드 - 부분 합
최초의 입력 받은 배열은 위 처럼 10, 20, 30, 40, 50 으로 이루어 져있는 배열이다.
배열의 부분합을 만들기 위해 0 번째 배열을 추가하고 배열[i-1] + 배열[i] 부분 합을 구한다.
문제 에서 1번과 4번 배열의 합을 구하라고 나와 있다. 1번 부터 N 까지는 모두 계산이 되어 있음으로 위와 같이 답을 도출 할 수 있다.
두번 째 예제에서는 2번 부터 4 까지의 합을 계산 해야 한다.
2번 의 부분합은 30 임으로 1번의 값을 제외해야 한다.
세번 째 예제에서는 3번부터 5번 까지의 합을 계산 해야 한다.
3번의 부분합은 60 임으로 2번 부분합을 제외 해야 한다.
마찬 가지로 나머지도 동일 하다.
3. 코드
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <list>
#include <queue>
#include <map>
using namespace std;
// 상 하 좌 우
int dy[] = { 0, -1, 1, 0};
int dx[] = { -1, 0, 0, 1};
int main() {
std::ios::sync_with_stdio(false); cin.tie(0);
int n; cin >> n;
vector<int> arr(n+1);
arr[0] = 0;
cin >> arr[1];
for(int i=2; i<n+1; i++) {
int d; cin >> d;
arr[i] = arr[i-1] + d;
}
int m; cin >> m;
while(m--) {
int i,j; cin >> i >> j;
int sol = arr[j] - arr[i-1];
cout << sol << "\n";
}
return 0;
}
반응형'다이나믹프로그래밍(DP)' 카테고리의 다른 글
백준 11055 번: 가장 큰 증가 부분 수열 (0) 2018.08.02 백준 1912번: 연속합 (0) 2018.07.03 백준 10986번: 나머지 합 (0) 2018.07.01 백준 1904번: 01타일 (0) 2018.06.24 백준 11726번: 2xn 타일링 (0) 2018.06.23