Files
baekjoon-study/workbook_7319/gold/2240-g4.py
2026-04-02 20:57:49 +09:00

48 lines
1.3 KiB
Python

# 자두나무
import sys
input = sys.stdin.readline
def solution():
t, w = map(int, input().rstrip().split())
plum = [0] * (t+1)
for i in range(1, t+1):
plum[i] = int(input().rstrip())
dp = [[0] * (t+1) for _ in range(w+1)]
for i in range(1, t+1):
dp[0][i] = dp[0][i-1]
if plum[i] == 1:
dp[0][i] += 1
for i in range(1, w+1):
for j in range(1, t+1):
dp[i][j] = max(dp[i][j-1], dp[i-1][j-1])
if (plum[j] == 1 and i%2 == 0) or (plum[j] == 2 and i%2 == 1):
dp[i][j] += 1
result = 0
for i in range(w+1):
result = max(result, dp[i][t])
print(result)
return
solution()
"""
걸린 시간: 40분
시간 복잡도: w*t의 테이블을 채워야 하기 때문에 O(w*t)이다.
해설: 현재의 상황은 몇번째 이동한 상황인지로 나뉘고, w만큼 이동했을 때 t초의 상황은 이번에 움직였거나, 이번에 안 움직였거나이다.
따라서 dp[w][t] = max(dp[w][t-1], dp[w-1][t-1]) 이다.
이때, w가 홀수면 2번, 짝수면 1번 나무에 있는 것이므로 t초에 떨어질 나무와 w의 홀짝 여부가 맞으면 +1을 해줘야한다.
그리고 t초의 최대값은 이동을 얼마나 했을 때인지 모르기 때문에 마지막에 t초의 전체 w에 대해 최대값을 구해야한다.
"""