문 제
소 스 코 드
#include <iostream>
#include <algorithm>
constexpr int MIN_INT{ -1'000'000'000 };
int main() {
int N;
std::cin >> N;
int *seqadd{ new int[N] };
int *dp{ new int[N] };
std::fill_n(dp, N, 0);
for (int i = 0; i < N; ++i) std::cin >> seqadd[i];
dp[0] = seqadd[0];
int maxnum{ dp[0] };
for (int i = 1; i < N; ++i) {
dp[i] = std::max(dp[i - 1] + seqadd[i], seqadd[i]);
maxnum = std::max(maxnum, dp[i]);
}
std::cout << maxnum;
delete[] dp;
delete[] seqadd;
return 0;
}
풀 이
-
A : { 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 }
dp[0] : 10
dp[1] : Max( dp[0] + A[1], A[1] )
dp[2] : Max( dp[1] + A[2], A[2] )
dp[3] : Max( dp[2] + A[3], A[3] )
...
dp[N - 1] : Max ( dp[N - 2] + A[N - 1], A[N - 1] )
-
dp[N-2] + A[N-1]과 A[N - 1] 중에 더 큰 수를 찾는 이유는 이전의 누적값 보다 현재 값이 크다면,
연속되는 과정에 문제가 있다는 뜻이기 때문에 현재 수에서 다시 진행하기 위하여 현재 값으로 누적값을 변경한다. -
만약, 무조건 끝에 있는 누적값이 MAX가 아니기 때문에, 누적값 중에 최댓값을 알기 위하여 비교하여 진행한다.
주 의 점
#include <iostream>
#include <algorithm>
constexpr int MIN_INT{ -1'000'000'000 };
int main() {
int N;
std::cin >> N;
int *seqadd{ new int[N] };
int *dp{ new int[N] };
std::fill_n(dp, N, 0);
for (int i = 0; i < N; ++i) std::cin >> seqadd[i];
int addmax{ MIN_INT };
int temp;
for (int i = 0; i < N; ++i) {
dp[i] = seqadd[i];
temp = dp[i];
for (int j = i + 1; j < N; ++j) {
dp[i] = dp[i] + seqadd[j];
temp = std::max(temp, dp[i]);
}
addmax = std::max(addmax, temp);
}
std::cout << addmax;
delete[] dp;
delete[] seqadd;
return 0;
}
-
for 문을 2가지 쓰는 순차 진행의 경우
ex ) A[0] 부터 시작, A[1] 부터 시작, A[N - 1] 부터 시작
누적값으로 하는 것이 아닌 모든 값을 비교 하기 때문에 많은 시간이 걸린다.
결 과 값
문 제 출 처
문제 링크 : [ BAEKJOON ] : https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
'[ ALGORITHM ] > [ 백 준 ]' 카테고리의 다른 글
[BAEKJOON] 11047번 동전 0 (0) | 2020.07.06 |
---|---|
[BAEKJOON] 12865번 평범한 배낭 (0) | 2020.07.05 |
[BAEKJOON] 9251번 LCS (0) | 2020.07.03 |
[BAEKJOON] 2565번 전깃줄 (0) | 2020.07.02 |
[BAEKJOON] 11054번 가장 긴 바이토닉 부분 수열 (0) | 2020.07.01 |