-
다이나믹 프로그래밍 기초 문제풀이 < 병사 배치하기 >Python/알고리즘 2022. 9. 22. 16:34
문제 설명, 조건
● N명의 병사가 무작위로 나열되어 있습니다. 각 병사는 특정한 값의 전투력을 보유하고 있습니다.
● 병사를 배치할 때는 전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 합니다. 다시 말해 앞쪽에 있는 병사의 전투력이 항상 뒤쪽에 있는 병사보다 높아야 합니다.
● 또한 배치 과정에서는 특정한 위치에 있는 병사를 열외시키는 방법을 이용합니다. 그러면서도 남아 있는 병사의 수가 최대가 되도록 하고 싶습니다.● 입력 조건
첫째 줄에 N이 주어집니다. (1 <= N <= 2,000) 둘째 줄에 각 병사의 전투력이 공백으로 구분되어 차례대로 주어집니다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수입니다.
● 출력 조건
첫째 줄에 남아 있는 병사의 수가 최대가 되도록 하기 위해서 열외시켜야 하는 병사의 수를 출력합니다.
● 입력 예시
7
15 11 4 8 5 2 4
● 출력 예시
2답안 예시
n = int(input())
array = list(map(int, input().split()))
# 순서를 뒤집어 '최장 증가 부분 수열' 문제로 변환
array.reverse()
# 다이나믹 프로그래밍을 위한 1차원 DP 테이블 초기화
dp = [1] * n
# 가장 긴 증가하는 부분 수열(LIS) 알고리즘 수행
for i in range(1, n):
for j in range(0, i):
if array[j] < array[i]:
dp[i] = max(dp[i], dp[j] + 1)
# 열외해야 하는 병사의 최소 수를 출력
print(n - max(dp))출처 : https://www.youtube.com/watch?v=5Lu34WIx2Us&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=8
'Python > 알고리즘' 카테고리의 다른 글
우선순위 큐/힙 (1) 2022.09.23 다익스트라 최단 경로 알고리즘 (0) 2022.09.23 다이나믹 프로그래밍 기초 문제풀이 < 금광 > (0) 2022.09.15 다이나믹 프로그래밍 기초 문제풀이 < 효율적인 화폐 구성 > (0) 2022.09.14 다이나믹 프로그래밍 기초 문제풀이 < 1로 만들기 > (0) 2022.09.14