Study hard
(c++)백준 1912번: 연속합 본문
https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
* 연속된 수를 선택해야 하며, 수를 한 개 이상 선택해야 한다. = 바로 직전 수까지의 연속합에 현재 값을 더하는 게 현재 값보다 큰지 비교하여 dp에 저장
※점화식※
dp[i] : i번째 수를 마지막으로 연속합에 포함시킬 때 나올 수 있는 가장 큰 값
dp[1] = A[1]
dp[x] = max(dp[x-1] + A[x], A[x])
#include <iostream>
#include <algorithm>//max
using namespace std;
int n;
long long dp[100001];
long long A[100001];
void DP() {
long long Max = -10000;
dp[1] = A[1];
for (int i = 2; i <= n; i++) {
//이전까지의 연속합에 현재 값을 더하는 거랑 그냥 현재값 중 더 큰 거
dp[i] = max(dp[i - 1] + A[i], A[i]);
}
for (int i = 1; i <= n; i++) {
Max = max(Max, dp[i]);
}
cout << Max << endl;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> A[i];
}
DP();
return 0;
}
'백준 > DP' 카테고리의 다른 글
(c++)백준 1699번: 제곱수의 합 (0) | 2020.06.09 |
---|---|
(c++)백준 2579번: 계단 오르기 (0) | 2020.06.09 |
(c++)백준 11504번: 가장 긴 바이토닉 부분 수열 (0) | 2020.06.09 |
(c++)백준 11722번: 가장 긴 감소하는 부분 수열 (0) | 2020.06.09 |
(c++)백준 11055번: 가장 큰 증가 부분 수열 (0) | 2020.06.09 |