티스토리 뷰

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

 

18353번: 병사 배치하기

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

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
= int(input())
arr = list(map(int, input().split()))
 
answer = [1* n
 
for i in range(n):
    for a in range(len(arr[:i])):
        if arr[i] < arr[a] and answer[i] < answer[a] + 1:
            answer[i] = answer[a] + 1
 
print(n - max(answer))
cs

O(n^2) 시간복잡도로 접근한 DP 문제이다.

방식을 다르게 하면 nlogn까지 줄일 수 있을 것 같은데, n이 최대 2000이라서 그냥 n^2으로 했다.

검사하는 병사의 전투력을 앞에 있는 병사들의 전투력과 비교하면서, 전투력이 더 작으면 해당 병사까지의 최대 수열 길이 + 1을 저장한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함