문제
https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
문제 요약
n개의 정수로 이루어진 수열에서 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 출력한다.
단, 수는 한 개 이상 선택해야 한다.
코드
#include <iostream>
#define MAX 100000
using namespace std;
int n;
int arr[MAX];
int dp[MAX]; // dp[i]: i번째 수를 포함하면서, i번째 수까지 수열 중 최대 합
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
dp[0] = arr[0];
int res = arr[0];
for (int i = 1; i < n; i++) {
dp[i] = max(arr[i], dp[i - 1] + arr[i]);
res = max(dp[i], res);
}
cout << res;
}
코드 설명
Bottom - Up 방식의 Dynamic Programming으로 문제를 해결한다.
dp[i]는 주어진 수열에서 i번째 수를 마지막 숫자로 하는 부분 수열 중 합이 가장 큰 수열의 합을 저장한다.
dp[i]는
i - 1번째 수를 마지막 숫자로 하는 부분 수열 중 합이 가장 큰 수열에서 i번째 수를 더한 값
과
i번째 수의 값
을 비교해서 더 큰 값이 된다.
dp[i]를 구할 때마다 최대값(res)을 갱신하고, 모든 dp테이블을 채우면 최대값을 출력한다.
'Algorithm Problems > 다이나믹 프로그래밍' 카테고리의 다른 글
[백준/C++] 15992번: 1, 2, 3 더하기 7 (0) | 2024.07.05 |
---|---|
[백준/C++] 10844번: 쉬운 계단 수 (0) | 2024.03.24 |
[백준/C++] 2579번: 계단 오르기 (0) | 2024.03.22 |
[백준/C++] 1932번: 정수 삼각형 (0) | 2024.03.05 |
[백준/C++] 12865번: 평범한 배낭 (2) | 2024.02.12 |