문제:
정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수 있다. 예를 들어 앞에서부터 순서대로 크기가(1,5,2,3,7)인 5개의 상자가 있다면, 크기 1인 상자를 크기 5인 상자에 넣고, 다시 이 상자를 크기 7인 상자 안에 넣을 수 있다. 하지만 이렇게 상자를 넣을 수 있는 방법을 여러 가지가 있을 수 있다. 앞의 예에서 차례대로 크기가 1, 2, 3, 7인 상자를 선택하면 총 4개의 상자가 한 개의 상자에 들어가게 된다.
상자의 크기가 주어질 때, 한 번에 넣을 수 있는 최대의 상자 개수를 출력하는 프로그램을 작성하시오.
입력:
파일의 첫 번째 줄은 상자의 개수 n(1<=n<=1000)을 나타낸다. 두 번째 줄에는 각 상자의 크기가 순서대로 주어진다. 상자의 크기는 1,000을 넘지 않는 자연수이다.
출력:
첫쨰 줄에 한 줄에 넣을 수 있는 최대의 상자 개수를 출력한다.
풀이방법:
앞에 있는 작은 상자를 뒤에 있는 큰 상자에 넣을 수 있으므로 이는 다이나믹프로그래밍을 사용한 LIS 문제와 같다.
LIS에서 lis[i]는 i번째 수열까지 한 번에 넣을 수 있는 최대의 상자 개수이며, i+1을 추가했을 때, boxes[1]~boxes[i]까지 boxes[i+1]보다 작은 값이 있는지 파악하고, 그 수에 해당하는 lis[k] 값들 중에 최댓값에 1을 더해주는 방식으로 진행한다. 그러고 전체 lis에서 최댓값을 출력해주면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
n=int(input())
boxes=list(map(int,input().split()))
lis=[1]*n
for i in range(1,n):
temp = (-1,-1)
for j in range(i+1):
if boxes[j] < boxes[i]:
if temp[0] < lis[j]:
temp = (lis[j],j)
if temp[1] >= 0:
lis[i]=lis[temp[1]]+1
print(max(lis))
|
cs |
문제링크:
https://www.acmicpc.net/problem/1965
'Algorithm > Python' 카테고리의 다른 글
[BOJ]1937. 욕심쟁이 판다 (0) | 2019.11.11 |
---|---|
[BOJ]6359. 만취한 상범 (0) | 2019.11.09 |
[BOJ]2225. 합분해 (0) | 2019.11.07 |
[BOJ]1010. 다리 놓기 (0) | 2019.11.06 |
[BOJ]1495. 기타리스트 (0) | 2019.11.05 |