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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <iostream> #include <algorithm> #include <stack> long long d[100050]; int num[100050]; long long dr[100050]; int rev_num[100050]; using namespace std; int main() { stack<int> reverse_val; int input; cin >> input; for (int i = 1; i <= input; ++i) { cin >> num[i]; } d[1] = num[1]; for (int i = 1; i <= input; ++i) { d[i] = d[i - 1] + num[i]; //새로 부분합을 시작하는 경우 if (d[i] < num[i]) d[i] = num[i]; } //수열을 뒤집은 후 부분열을 구한다. for (int i = 1;i <= input; ++i) reverse_val.push(num[i]); for (int i = 1; i <= input; ++i) { rev_num[i] = reverse_val.top(); reverse_val.pop(); } dr[1] = rev_num[1]; for (int i = 1; i <= input; ++i) { dr[i] = dr[i - 1] + rev_num[i]; //새로 부분합을 시작하는 경우 if (dr[i] < rev_num[i]) dr[i] = rev_num[i]; } //제거하지 않았을 경우의 정답 long long ans = d[1]; for (int i = 1;i <= input; ++i) ans = max(ans, d[i]); //제거 했을 경우의 정답 for (int k = 1; k <= input; ++k) ans = max(ans, d[k - 1] + dr[input - k]); cout << ans << endl; return 0; } | cs |
'백준 온라인 저지' 카테고리의 다른 글
백준 1699: 제곱수의 합 (0) | 2018.07.10 |
---|---|
백준 2579: 계단 오르기 (0) | 2018.07.10 |
백준 1912: 연속합 (0) | 2018.07.09 |
백준 11722: 가장 긴 감소하는 부분 순열 (0) | 2018.07.09 |
백준 11053: 가장 긴 증가하는 부분 순열 (0) | 2018.07.09 |