Baekjoon Online Judge No.1912 [연속합]
Problem
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
Code
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
32
33
34
35
36
|
#include <iostream>
#include <vector>
using namespace std;
int N;
vector<int> nums;
void input() {
cin >> ::N;
nums.assign(N, 0);
for (int i = 0; i < N; i++)
cin >> nums[i];
}
int solve() {
vector<int> dp(N, 0);
dp[0] = nums[0];
int ans = dp[0];
for (int i = 1; i < N; i++) {
dp[i] = max(nums[i], nums[i] + dp[i - 1]);
ans = max(ans, dp[i]);
}
return ans;
}
int main() {
input();
int ans = solve();
cout << ans;
}
|
cs |
How to solve
만약 수열의 모든 수가 양수라면 모조리 다 더해버린다면 그 값이 답이 될 것이다. 그 말은 즉, 수열에서 음수에 대해서 만 잘 처리하면 된다는 말이 될 것이다. 그렇다면 이 문제의 점화식을 세우기 위해 고려해볼 사항은 다음과 같다.
- case A) dp[ i ] = nums[ i ] + dp[ i - 1 ] 로 계속 더하는게 제일 큰가?
- case B) dp[ i ] = nums[ i ] 로 새로 더해나가는게 제일 큰가?
그리고 이 사항에 대해선 다음과 같이 정리할 수 있다.
결국, 이 경우들에 대해선 모두 dp[ i ] = nums[ i ] 아니면 dp[ i ] = nums[ i ] + dp[ i - 1 ] 이 됨을 알 수 있다. 따라서 dp[ i ]의 값은 위 코드 24번째 line 과 같이 max(nums[ i ], nums[ i ] + dp[ i - 1 ]) 가 된다.
728x90
'Algorithm (C++ based) > BOJ' 카테고리의 다른 글
BOJ No.2798 [블랙잭] (0) | 2021.02.05 |
---|---|
백준 No.11049 [행렬 곱셈 순서] (0) | 2021.02.04 |
백준 No.2603 [색종이 만들기] (0) | 2021.01.24 |
백준 No.2447 [별 찍기 - 10] (0) | 2021.01.24 |
백준 No.10757 [큰 수 A+B] (0) | 2021.01.05 |
댓글