컴공생 누르지 마세요! 컴공생 울어요.

[DP] (2) 병사 배치하기 본문

알고리즘 유형별 기출문제/다이나믹 프로그래밍

[DP] (2) 병사 배치하기

당도최고치악산멜론 2023. 3. 18. 02:06

이코테 p.380 병사 배치하기

https://www.acmicpc.net/problem/18353

 

18353번: 병사 배치하기

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 2,000) 둘째 줄에 각 병사의 전투력이 공백을 기준으로 구분되어 차례대로 주어진다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

문제 해설 & 소스코드

  • dp[i] = i번째 원소를 마지막 원소로 갖는 부분 수열의 최대 길이
  • i번째 원소의 앞에 i번째 원소보다 작은 값을 갖는 j번째 원소가 있다면 dp 테이블 갱신
    • i번째 원소의 앞에 i번째 원소보다 작은 값이 있게 하기 위해서 입력받은 리스트의 순서를 반대로 뒤집음
# 입력 받기
n = int(input())
array = list(map(int, input().split()))
array.reverse() # 순서를 반대로 뒤집기

# dp[i] = i번째 원소를 마지막 원소로 갖는 부분 수열의 최대 길이
dp = [1] * n

for i in range(1, n):
  for j in range(0, i):
    # i번째 원소의 앞에 i번째 원소보다 작은 j번째 원소가 있는 경우
    if array[j] < array[i]:
      dp[i] = max(dp[i], dp[j] + 1) # dp 테이블 갱신

# 열외시켜야 하는 최소 병사의 수 출력
print(n - max(dp))

'알고리즘 유형별 기출문제 > 다이나믹 프로그래밍' 카테고리의 다른 글

[DP] (1) 퇴사  (0) 2023.03.18
Comments