# 자두나무 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에 대해 최대값을 구해야한다. """