https://greentea31.tistory.com/36
백준 1912 - 연속합 [파이썬]
https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같..
greentea31.tistory.com
풀이 과정
https://greentea31.tistory.com/36
백준 1912 - 연속합 [파이썬]
https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같..
greentea31.tistory.com
위의 연속합 문제에서 수열에서 수를 하나 제거할 수 있다는 조건이 추가된 문제이다.
d[i]를 i번째 원소를 마지막으로 하는 가장 큰 연속합이라 하고, d2[i]를 i번째 원소에서 시작하는 가장 큰 연속합이라 하자. 그렇다면 i번째 원소를 제거했을 경우의 연속합을 구하면 d[i-1] + d2[i+1] 임을 알 수 있다.
d[i]의 점화식은 위의 문제를 풀어봤다면,
d[i] = d[i-1] + a[i] (d[i-1] > 0)
= A[i] (d[i-1] <= 0) 임을 알 수 있고,
d2[i]의 점화식은 위의 점화식을 조금 변형한
d2[i] = d2[i+1] + a[i] (d2[i+1] >= 0)
= a[i] (d2[i+1] < 0) 임을 알 수 있다.
수열의 모든 원소 i에 대해 d[i], d[i-1] + d2[i+1]을 구해보고 구한 값들 중 가장 큰 값을 정답으로 출력해주면 된다.
소스 코드
import sys
n = int(sys.stdin.readline())
A = list(map(int, sys.stdin.readline().split()))
d = [i for i in A]
d2 = [i for i in A]
for i in range(1, n):
d[i] = max(d[i-1] + A[i], A[i])
for i in range(n-2, 1, -1):
d2[i] = max(d2[i+1] + A[i], A[i])
max1 = max(d)
max2 = -1001
for i in range(1, n-1):
max2 = max(max2, d[i-1] + d2[i+1])
print(max(max1, max2))
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 2309 - 일곱 난쟁이 [파이썬] (0) | 2022.05.26 |
---|---|
백준 2133 - 타일 채우기 [파이썬] (0) | 2022.05.26 |
백준 11054 - 가장 긴 바이토닉 부분 수열 [파이썬] (0) | 2022.05.26 |
백준 11722 - 가장 긴 감소하는 부분 수열 [파이썬] (0) | 2022.05.26 |
백준 11055 - 가장 큰 증가 부분 수열 [파이썬] (0) | 2022.05.26 |