https://www.acmicpc.net/problem/1912
1 . ox를 그때그때 선택해버리기
1.완탐 : i번째수를 선택함, 안함으로 2^n 탐색해야함
2. 선택한경우 vs 선택안한경우에서 최적인 경우를 그때그떄 선택한다.
3. 이전값 + 현재값() vs 현재값(나부터 연속합 새로시작) 중에 큰값을 선택하면 된다.
2.전체코드
#include <bits/stdc++.h>
using namespace std;
long long d[100004], a[100004],n;
//d[i]: i자리까지 연속합중 최대값
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
d[i] = a[i];
}
d[1] = a[1];
for (int i = 2; i <= n; ++i) {
d[i] = max(a[i], d[i - 1] + a[i]);
//d[i]=max(현재값[새로시작], 이전값+현재값)
}
//각각 i자리까지의 최대값이 저장됨
//d[n]이 최대값 보장이아님 -> 최대값찾으면됨.
cout << *max_element(d + 1, d + n + 1);
}
'Algorithm > dp' 카테고리의 다른 글
백준 1699 제곱수의 합 c++ // dp 2차원 to 1차원, 수학으로 시간복잡도줄이기 (0) | 2024.04.16 |
---|---|
백준 11052 카드구매하기 c++ //dp 관찰방법 (0) | 2024.04.15 |
백준 11053 LIS c++ // dp, 규칙발견, 일반화 (0) | 2024.04.15 |
백준 1520 내리막길 c++ // top-down dp, dfsDp, 상하좌우탐색 문제점 (0) | 2024.04.10 |
백준 1890 점프 c++ // dp, 배열순회dp, dp[next] += dp[cur] (0) | 2024.04.08 |