우선은 L이 고정된 경우에 대해 생각해보자. 책의 순서가 정해져 있으므로 전형적인 동적 계획법 문제가 된다.
를 1~i번째의 책을 꽂을 때 책장 높이의 최소값이라 정의하면, 의 점화식을 얻는다. 이 때의 시간복 잡도는
이다. 하지만 시간복잡도를
으로 줄일 수 있다.
가 단조증가하므로
고정된
값에 대해
가 같다면 가장 작은
에 대해서만 보면 된다.
즉,
에서부터 앞으로 오면서
의 값을 더 크게 만드는
에 대해
에 대해서만 봐도 된
다.
값을 더 크게 만든다는 것은
값이
까지의 자기 뒤의 모든 것보다 큼을
의미하므로 그러한 지점을 저장하기 위해 스택을 이용한다.
에 대해 스택의 위에서부터 보면서 현재보다 작은 것들을 다 빼내고
를 집어넣는다.
스택을 관리하면서 스택에 든
에 대해 바로 다음의
에 대해서는 알맞은
값으로 갱신 해주고 나머지
값은 무한대로 저장한다.
인덱스 트리를 이용하여
를 만족하는 구간에서의 최소값을 구하고 구간 가장 앞의 j에서도 최소가 될 수 있으므로 비교해서 최소값을 구한다.
이제 고정된
에 대해 최소의
를 구하는 문제는 해결된다.
본 문제는
과
중 큰 값을 최소화하는 문제인데
이 증가함에 따라 최소의
가 단조감소하므로
과
의 최대값은 쭉 감소하다가 최소가 되는 지점부터 다시 증가하므로 이분검색을 사용하여 최소가 되는 점을 찾을 수 있다.
이런 식으로 하면 총 시간복잡도
로 해결