티스토리 뷰
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
다시 푼 문제.
이전 글: tose33.tistory.com/22
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
a | 2 | 1 | -4 | 3 | 4 | -4 | 6 | 5 | -5 | 1 |
d | 2 | 3 | -1 | 3 | 7 | 3 | 9 | 14 | 9 | 10 |
a[i-1] + a[i] 와 a[i] 를 비교해서 큰 값이 d[i]이다.
예를들어 현재 a[3]를 계산중이라고 해보자.
d[2]에는 n = 2 까지의 연속합 중 최대값이 저장되 있고 d[2] = 3이다.
이제 d[2]에 a[3]을 더한값과 그냥 d[2]중 큰값이 d[3]이 된다.
d[2] + a[3] = -1 이고
a[3] = -4 이므로
d[3] = -1 이다.
이제 a[4]를 비교하면
d[3] = -1 이다. 즉 a[3]까지의 연속합 중 최댓값이 -1 이라는 뜻이다.
d[3] + a[4] = 2 이고 a[4] = 3 이므로 d[4] = 3 이다.
즉 d[i-1]은 a[i-1]까지의 연속합 중 최댓값이 보장되있으므로 (저장되있으므로)
d[i-1]에 a[i]를 더하면 값이 더 커질지 안커질지를 판단하는 것이다.
더 커진다면 지금까지의 연속합(d[i-1])에 a[i]를 더하면 되는것이고,
작아진다면 연속합은 끊기고 d[i]는 a[i]가 되는 것이다. (새로운 연속 시작)
#include <iostream>
using namespace std;
int a[100001];
int d[100001];
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
d[1] = a[1];
int ans = d[1];
for(int i = 2; i <= n; i++) {
if(d[i-1] + a[i] > a[i]) d[i] = d[i-1] + a[i];
else d[i] = a[i];
ans = max(ans, d[i]);
}
cout << ans;
}
'PS' 카테고리의 다른 글
백준 9184. 신나는 함수 실행 (0) | 2021.03.09 |
---|---|
백준 1003. 피보나치 함수 (0) | 2021.03.06 |
백준 11055. 가장 큰 증가 부분수열 (0) | 2021.03.04 |
백준 11054. 가장 긴 바이토닉 부분 수열 (0) | 2021.03.02 |
백준 9465. 스티커 (0) | 2021.03.02 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- binary search
- 조합
- 재귀
- Kruskal
- Stack
- DP
- recursion
- greedy
- Dijkstra
- two pointer
- graph
- C
- Tree
- floyd warshall
- back tracking
- dfs
- BFS
- 자료구조
- db
- 이분탐색
- priority queue
- permutation
- Implementation
- CSS
- Brute Force
- Spring
- MVC
- Unity
- Python
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함