접근
https://www.acmicpc.net/problem/2228
점화식을 생각해내기가 어려웠고, 구글을 통해 점화식에 대한 힌트를 얻어 문제를 해결할 수 있었다.
n번째 원소까지의 m개 구간합을 구하고자 할 때, max(n-2번째 원소까지의 m-1개 최대 구간합, n-1번째 원소까지의 m개 최대 구간합) + 현재값의 점화식을 통해 문제를 해결할 수 있다.
- n-2번째 원소까지 m-1개의 구간으로 나누고 n번째 원소를 m번째 구간으로 하여 구한 합과,
- n-1번째 원소까지 m개의 구간으로 나누고 n번째 원소를 m번째 구간에 포함하여 구한 합을 비교하는 것이다.
이 문제를 해결하기 위해 i번째 수를 포함하는 j개 최대 구간합을 concluded[i][j]에 저장하고, i번째 수를 포함하지 않는 j개 최대 구간합을 notConcluded[i][j]에 저장하였다. 이 두 matrix의 마지막 값 중 큰 값을 출력하여 문제를 해결할 수 있다.
코드
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
concluded = [[0] + [float("-inf")] * M for _ in range(N + 1)]
notConcluded = [[0] + [float("-inf")] * M for _ in range(N + 1)]
for i in range(1, N + 1):
num = int(input())
for j in range(1, M + 1):
notConcluded[i][j] = max(concluded[i - 1][j], notConcluded[i - 1][j])
concluded[i][j] = max(concluded[i - 1][j], notConcluded[i - 1][j - 1]) + num
print(max(concluded[N][M], notConcluded[N][M]))
더 생각해 볼 것?
...
코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!
반응형
'코딩 > 백준 (Python)' 카테고리의 다른 글
백준 2208: 보석 줍기 (Python) (0) | 2023.11.18 |
---|---|
백준 2169: 로봇 조종하기 (Python) (0) | 2023.11.05 |
백준 1937: 욕심쟁이 판다 (Python) (0) | 2023.10.15 |
백준 11048: 이동하기 (Python) (0) | 2023.10.09 |
백준 10815: 숫자 카드 (Python) (0) | 2023.04.15 |
최근댓글