티스토리 뷰

PS

백준 13398. 연속합 2

tose33 2022. 8. 8. 17:04

https://www.acmicpc.net/problem/13398

 

13398번: 연속합 2

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

아래 연속합 문제에서 이어지는 문제다.

https://tose33.tistory.com/97

 

백준 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
링크
«   2026/02   »
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
글 보관함