컴공생 누르지 마세요! 컴공생 울어요.
[DP] (2) 병사 배치하기 본문
이코테 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