Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
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
Tags
more
Archives
Today
Total
관리 메뉴

끄적끄적

백준 [1965] 상자넣기 본문

코테준비/백준

백준 [1965] 상자넣기

alstj_성공 2022. 8. 26. 18:51

출처 : https://www.acmicpc.net/problem/1965

 

1965번: 상자넣기

정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가

www.acmicpc.net

 

LIS(Longest Increasing Subsequence, 최장 증가 수열)와 DP를 동시에 이용하는 문제

(LIS를 구하는 방법 중 하나가 DP라고 한다.)

 

- LIS란?

원소가 n개인 배열이 주어졌을 때, 이 배열의 원소를 뽑아 만든 부분 수열 중, 각 원소가 이전 원소보다 크며, 그 길이가 최대인 부분 수열을 의미한다.

ex) {6,2,5,1,7,4,8,3} 의 LIS -> {2,5,7,8}

DP문제로 자주 나오는 유형이며, O(N^2)와 O(NlogN)의 시간복잡도를 갖는 두가지의 알고리즘이 존재한다고 한다.

이 문제에서 사용하는 방법이 O(N^2)의 알고리즘이며, O(NlogN)은 이분탐색을 활용해야한다.(자세한 것은 모름)

 

해결 방법)

dp[i] = 자신보다 이전에 있는 원소들 중 작은 원소들의 개수 + 1(자기자신 포함)

-> 먼저, 자기 자신보다 작은 수들을 for문을 통해 찾고, 이 작은 수들의 dp값을 하나씩 보며 이 중 최댓값을 찾아준 후 최댓값 + 1을 해준다.

ans를 사용해서 max값을 업데이트해줘야하는 이유

-> 맨 마지막 값이 가장 큰 값은 아니므로 최댓값이 어디에 속해 있을지 모르므로 i가 바뀔때마다 dp[i]와 ans를 비교해서 큰 값으로 저장해줘야 한다.

box[j]<box[i] && dp[i]<dp[j]+1 //핵심 LIS 방식

-> 두개의 조건을 모두 만족해야하는 이유

이 문제는 자기 자신보다 작은 수의 개수만 찾는 문제가 아니다. 오름차순으로 정렬되는게 아니고, 각 인덱스에서의 최대 상자개수를 찾아야 하는 문제이기 때문

'코테준비 > 백준' 카테고리의 다른 글

백준 [1759] 암호 만들기  (0) 2022.08.30
백준 [14495] 피보나치 비스무리한 수열  (0) 2022.08.30
백준 [14501] 퇴사  (0) 2022.08.26
백준 [16928] 뱀과 사다리 게임  (0) 2022.08.24
백준 [11559] Puyo Puyo  (0) 2022.08.23