사하르나의 계단

시간 제한0.2초메모리 제한128 MB

요약
수열을 k개의 서로 겹치지 않는 비감소 부분수열로 나눌 때 선택할 수 있는 원소 수의 최댓값을 구하고, 모든 원소 n개를 다 쓰게 되는 k까지 각 k에 대한 값을 출력한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 그리디, 배열, 정렬
정답자
아직 제출이 없습니다

문제

몰도바의 사하르나(Saharna)는 동굴과 폭포로 이름난 아름다운 명소로, 그곳에서는 다양한 모양과 크기의 돌을 찾을 수 있다. 중세 시대에는 이 돌들로 요새의 계단을 쌓았으며, 계단의 각 단은 원칙적으로 돌 하나로 만들어졌다.

돌은 무거워서 정해진 순서대로 한 줄로 고정되어 놓여 있다. 각 돌의 높이는 알려져 있어, 정수 수열 H=(h1,h2,…,hi,…,hn)H = (h_1, h_2, \dots, h_i, \dots, h_n) 로 주어진다. 여기서 hih_i 는 ii 번째 돌의 높이이다.

계단을 만들 때 장인은 돌들을 놓인 순서대로 훑으면서 각 단에 쓸 돌을 하나씩 고른다. 단, 새로 고르는 돌의 높이는 바로 직전에 고른 돌의 높이보다 낮아서는 안 된다. 즉, 하나의 계단은 (원래 순서를 유지하는) 높이가 비내림차순인 부분수열이다.

예를 들어 H=(1,3,4,2,3,4,1,2,2,3,3,2)H = (1, 3, 4, 2, 3, 4, 1, 2, 2, 3, 3, 2) 일 때, 아래에서 밑줄 친 돌들로 하나의 계단을 만들 수 있다.

H=(1‾,3,4,2‾,3,4,1,2‾,2‾,3‾,3‾,2)H = (\underline{1}, 3, 4, \underline{2}, 3, 4, 1, \underline{2}, \underline{2}, \underline{3}, \underline{3}, 2)

돌을 더 많이 쓸수록 더 좋은 성을 지을 수 있으므로, 장인은 가능한 한 많은 돌을 사용하려 한다.

L(H,k)L(H, k) 를, 각각 최소 한 단 이상을 가지며 서로 겹치지 않게 돌을 나누어 쓰는 kk 개의 계단에 사용할 수 있는 돌의 최대 개수라고 정의한다.

위 예시에서 L(H,1)=6L(H, 1) = 6 이며, 밑줄 친 돌들이 최적의 계단 하나를 이룬다.

마찬가지로 L(H,2)=9L(H, 2) = 9 임을 확인할 수 있다. 아래 그림에서 첫 번째 계단의 돌은 한 줄 밑줄( ‾\underline{\ }), 두 번째 계단의 돌은 두 줄 밑줄( ‾‾\underline{\underline{\ }})로 표시했다.

H=(1‾,3‾‾,4‾‾,2‾,3,4‾‾,1,2‾,2‾,3‾,3‾,2)H = (\underline{1}, \underline{\underline{3}}, \underline{\underline{4}}, \underline{2}, 3, \underline{\underline{4}}, 1, \underline{2}, \underline{2}, \underline{3}, \underline{3}, 2)

k=2k = 2 일 때 첫 번째 계단에는 6개, 두 번째 계단에는 3개의 돌이 쓰인다.

계단을 3개 만들 때 사용할 수 있는 돌의 최대 개수는 아래와 같다.

H=(1‾,3‾‾‾,4‾‾‾,2‾,3‾,4‾‾‾,1‾‾,2‾‾,2‾‾,3‾,3‾,2‾‾)H = (\underline{1}, \underline{\underline{\underline{3}}}, \underline{\underline{\underline{4}}}, \underline{2}, \underline{3}, \underline{\underline{\underline{4}}}, \underline{\underline{1}}, \underline{\underline{2}}, \underline{\underline{2}}, \underline{3}, \underline{3}, \underline{\underline{2}})

세 줄 밑줄은 세 번째 계단을 나타내며, 나머지 표시는 앞과 같은 의미이다. 따라서 L(H,3)=12L(H, 3) = 12 이다. k=3k = 3 일 때 첫 번째 계단에 5개, 두 번째 계단에 4개, 세 번째 계단에 3개의 돌이 쓰인다. k=3k = 3 에서 고른 첫 번째·두 번째 계단은 k=1,2k = 1, 2 일 때 고른 계단과 다를 수 있음에 유의하라.

kk 를 1,2,3,…1, 2, 3, \dots 으로 늘려 가면 어떤 값 qq 에서 L(H,q)=nL(H, q) = n 이 된다. 여기서 nn 은 돌의 총 개수이다.

주어진 높이 수열 HH 에 대해 k=1,2,…,qk = 1, 2, \dots, q 각각에 대한 L(H,k)L(H, k) 를 계산하는 프로그램을 작성하라.

입력

첫째 줄에 양의 정수 nn 이 주어진다. 둘째 줄에 nn 개의 양의 정수 h1,h2,…,hnh_1, h_2, \dots, h_n 이 공백으로 구분되어 주어진다.

출력

qq 개의 줄을 출력한다. kk 번째 줄에는 L(H,k)L(H, k) 의 값을 출력한다(k=1,2,…,qk = 1, 2, \dots, q). 여기서 qq 는 L(H,q)=nL(H, q) = n 을 만족하는 가장 작은 값이다.

제한

  • 1≤n≤50001 \le n \le 5000
  • 1≤hi≤255, i=1,2,…,n1 \le h_i \le 255,\ i = 1, 2, \dots, n

예제1

  1. 예제 1

    입력
    12
    1 3 4 2 3 4 1 2 2 3 3 2
    
    예상 출력
    6
    9
    12