[BOJ] 11659 "구간 합 구하기 4" 문제 풀이 & 소스 코드 With C/C++

반응형
반응형

#INFO

난이도 : SILVER3

알고리즘 유형 : 다이나믹 프로그래밍(DP)

출처 : 11659번: 구간 합 구하기 4 (acmicpc.net)


#SOLVE

작은문제의 답으로 부터 큰 문제의 답을 도출하는 다이나믹 프로그래밍(DP) 알고리즘으로 풀이했다.

 

arr[] = 원소를 저장할 배열

dp[] = arr[i] 까지의 합을 저장할 배열

이때 dp[0]의 값은 arr[i]의 값과 동일하니 미리 초기화해 두고, dp[i] = dp[i-1] + arr[i] 라는 점화식을 세워 dp[] 배열을 초기화한다.

  int arr[100001] = {0,};
  int dp[100001] = {0,};
  for (int i = 0 ; i < N ; i++) {
    cin >> arr[i];
  }

  dp[0] = arr[0];
  for (int i = 1 ; i <= M ; i++) {
    dp[i] = dp[i-1] + arr[i];
  }

 

만약 (1,3) 사이의 값을 구하고 싶다면 dp[3] 에서 dp[1]을 빼주고 arr[1]의 값을 더해주면 된다.

따라서 이를 점화식으로 나타내면 sum(i, j) = dp[i] - dp[j] + arr[i] 와 같이 표현할 수 있다.

  int i,j;
  for (int k = 0 ; k < M ; k++) {
    cin >> i >> j;
    cout << dp[j - 1] - dp[i - 1] + arr[i - 1] << endl;
  }

 

#include <iostream>
using namespace std;

int arr[100001] = {0,};
int dp[100001] = {0,};

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  
  int N, M;
  cin >> N >> M;

  for (int i = 0 ; i < N ; i++) {
    cin >> arr[i];
  }

  dp[0] = arr[0];
  for (int i = 1 ; i <= M ; i++) {
    dp[i] = dp[i-1] + arr[i];
  }
  
  int i,j;
  for (int k = 0 ; k < M ; k++) {
    cin >> i >> j;
    cout << dp[j - 1] - dp[i - 1] + arr[i - 1] << '\n';
  }

  return 0;
}


반응형

댓글

Designed by JB FACTORY