티스토리 뷰
https://www.acmicpc.net/problem/13398
13398번: 연속합 2
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
아래 연속합 문제에서 이어지는 문제다.
백준 1912. 연속합
www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수..
tose33.tistory.com
다른 점은 이제 수열에서 수를 하나 제거 할 수 있다.
d 정의
d[0][i] = 수를 하나 제거할수 있는 기회를 아직 안썼고, i 까지의 연속합 중 최댓값
d[1][i] = 수를 하나 제거할수 있는 기회를 썼고, i 까지의 연속합 중 최댓값
점화식
d[0][i] = max(d[0][i-1]+a[i], a[i])
d[1][i] = max ( max(d[0][i-1], d[1][i-1]) + a[i], d[0][i-1])
d[0][i]는 수를 하나 제거할수 있는 기회를 쓰지 않은 경우이므로 연속합1 문제와 같다.
d[1][i]는 수를 하나 제거할수 있는 기회를 이미 쓴 경우 이므로 다음 두 수 중 큰 수가 된다.
max(d[0][i-1], d[1][i-1]) + a[i] 가 의미하는 바는 이전 숫자까지의 연속값중 최대인값 (기회를 썼어도되고 안썼어도 된다)에 현재 숫자를 더한 값이다.
d[0][i-1]이 의미하는 바는 현재 숫자를 포기하는 경우인 d[0][i-1] 중 큰 값이 된다. (현재 숫자를 포기했으므로 기회는 쓴것이다)
다른 분들 코드를 보니 이런 방법도 있었다.
left[i] = 0번 숫자 부터 i번째 까지 숫자들의 연속합중 최댓값
right[i] = 마지막 숫자부터 i번째 까지 숫자들의 연속합중 최댓값
이렇게 두 배열의 값을 구하고 나면 첫번째 숫자부터 마지막 숫자까지 하나씩 없에보면서 상수시간으로 값을 구할수 있다.
'PS' 카테고리의 다른 글
| 백준 13459. 구슬 탈출 (0) | 2022.08.11 |
|---|---|
| 백준 1766. 문제집 (0) | 2022.08.11 |
| 백준 9019. DSLR (0) | 2022.08.08 |
| 백준 17471. 게리맨더링 (0) | 2022.08.08 |
| 백준 2056. 작업 (0) | 2022.08.03 |
- Total
- Today
- Yesterday
- BFS
- Spring
- permutation
- two pointer
- 조합
- greedy
- binary search
- MVC
- back tracking
- CSS
- priority queue
- graph
- db
- Python
- Tree
- Stack
- Dijkstra
- Unity
- C
- floyd warshall
- 이분탐색
- DP
- 재귀
- Brute Force
- dfs
- Implementation
- Kruskal
- recursion
- 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 |
