48 lines
1.3 KiB
Python
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에 대해 최대값을 구해야한다.
|
|
""" |