관리 메뉴

커리까지

[백준] 22857번 가장 긴 짝수 연속한 부분 수열 (small) 파이썬 본문

알고리즘/풀이

[백준] 22857번 가장 긴 짝수 연속한 부분 수열 (small) 파이썬

목표는 커리 2023. 2. 4. 13:32
728x90
SMALL

문제

길이가 N$N$인 수열 S$S$가 있다. 수열 S$S$는 1 이상인 정수로 이루어져 있다.

수열 S$S$에서 원하는 위치에 있는 수를 골라 최대 K$K$번 삭제를 할 수 있다.

예를 들어, 수열 S$S$가 다음과 같이 구성되어 있다고 가정하자.

수열 S : 1 2 3 4 5 6 7 8

수열 S$S$에서 4번째에 있는 4를 지운다고 하면 아래와 같다.

수열 S : 1 2 3 5 6 7 8 

수열 S$S$에서 최대 K$K$번 원소를 삭제한 수열에서 짝수로 이루어져 있는 연속한 부분 수열 중 가장 긴 길이를 구해보자.

입력

수열 S$S$의 길이 N$N$와 삭제할 수 있는 최대 횟수인 K$K$가 공백으로 구분되어 주어진다.

두 번째 줄에는 수열 S$S$를 구성하고 있는 N$N$개의 수가 공백으로 구분되어 주어진다.

출력

수열 S$S$에서 최대 K$K$번 원소를 삭제한 수열에서 짝수로 이루어져 있는 연속한 부분 수열 중 가장 긴 길이를 출력한다.

제한
  •  1≤N≤50,000$1 \le N \le 50,000$ 
  •  1≤K≤100$1 \le K \le 100$ 
  •  1≤$1 \le$ 원소의 값 ≤106$\le 10^6$ 
예제 입력 1
8 2
1 2 3 4 5 6 7 8
예제 출력 1
3

제출 답안

'''
1. 아이디어
- dp를 만든다.
- 짝수인 경우에 횟수를 증가시켜 값을 업데이트 한다.
- 홀수인 경우에는 이전 값을 가져온다.
2. 시간 복잡도
- 
3. 변수
- num []
- dp [][]
'''

import sys
input = sys.stdin.readline

n, k = map(int,input().split())
num = [0] + list(map(int ,input().split()))
dp = [[0] * (k+1)  for _ in range(n + 1)]

for i in range(1, n+1):
    num[i] %= 2
    for j in range(k+1):
        if num[i] == 0:
            dp[i][j] = dp[i-1][j] + 1
        if j != 0 and num[i]:
            dp[i][j] = dp[i-1][j-1]

result = max(i[k] for i in dp)
print(result)
728x90
LIST
Comments