문제 설명

1. LIS 의 기본문제
2. LIS 는 가장 긴 증가하는 부분수열을 구하는 알고리즘이다.

풀이

dp 와 arr 배열을 둬서 그 전의 박스들을 모두 확인한다.
1. dp 배열에는 현재 그 박스위치에서 가장 많은 박스의 개수를 저장하고
2. arr 배열에서는 박스의 크기를 저장한다.
3. arr[현재 박스위치] > arr[이전의 박스 모두들] 을 해서 가장 높은 dp[이전의 박스 모두들] 를 골라 + 1 해준게 dp[현재 박스위치] 에 들어간다.

증명

1. dp[0] = 1
풀이의 3을 0 ~ N 까지 한게 증명의 설명이 되겠다.

코드

문제

정육면체 모양의 상자들이 일렬로 늘어서 있다. 상자들마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가 있다. 예를 들어 앞에서부터 순서대로 크기가 (1, 5, 2, 3, 7)인 5개의 상자가 있다면, 크기 1인 상자를 크기 5인 상자에 넣고, 다시 이 상자들을 크기 7인 상자 안에 넣을 수 있다. 하지만 이렇게 상자를 넣을 수 있는 방법은 여러 가지가 있을 수 있다. 앞의 예에서 차례대로 크기가 1, 2, 3, 7인 상자들을 선택하면 총 4개의 상자가 한 개의 상자에 들어가게 된다.

상자들의 크기가 주어질 때, 한 번에 넣을 수 있는 최대의 상자 개수를 출력하는 프로그램을 작성하시오.

입력

파일의 첫 번째 줄은 상자의 개수 n (1≤n ≤1000)을 나타낸다. 두 번째 줄에는 각 상자들의 크기가 순서대로 주어진다.

출력

첫째 줄에 한 줄에 넣을 수 있는 최대의 상자 개수를 출력한다.

예제 입력 1 

8
1 6 2 5 7 3 5 6

예제 출력 1 

5


+ Recent posts