Information Security

동적(다이나믹) 프로그래밍 본문

STUDY/Coding

동적(다이나믹) 프로그래밍

sohexz 2021. 11. 29. 13:55

이것이 코딩테스트다 380p

 

기본 아이디어 -> 가장 긴 증가하는 부분 수열(LIS)

 

가장 긴 증가하는 부분 수열이란?

하나의 수열이 주어졌을 때 값들이 증가하는 형태의 가장 긴 부분 수열을 찾는 문제

 

점화식

모든 0<=j<i에 대하여, max(D[i], D[j]+1) if array[j] < array[i]

 

=> 가장 긴 감소하는 부분 수열의 길이를 계산하는 문제로 간주하고, 입려긍로 주어진 원소의 순서를 뒤집은 뒤에 가장 긴 증가하는 부분 수열 문제를 풀 때의 점화식을 그대로 적용하면 해결할 수 있음

 

n=int(input()) #병사의 수 입력받기
array = list(map(int, input().split())) #병사의 전투력 입력받기
array.reverse() #순서를 뒤집어서 '가장 긴 증가하는 부분 수열' 문제로 변환

dp = [1]*n  # 다이나믹 프로그래밍을 위한 1차원 DP 테이블 초기화

#가장 긴 증가하는 부분 수열(LIS) 알고리즘 수행
for i in range(1,n): #i를 1부터 n-1까지 증가
	for j in range(0,i):
		if array[j] < array[i]:  #마지막 원소로 가지는 부분 수열의 최대 길이
			dp[i] = max(dp[i], dp[j] + 1) 

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

'STUDY > Coding' 카테고리의 다른 글

[프로그래머스] 게임 맵 최단거리  (0) 2024.03.22
[프로그래머스] 타켓 넘버  (0) 2024.03.22
이진탐색  (0) 2021.11.17
정렬  (0) 2021.11.10
DFS/BFS  (0) 2021.11.03