문제 형태
"정확히 \(k\)개"라는 개수 제약이 붙은 최적화 DP를 생각하자. 예: 배열을 정확히 \(k\)개 구간 으로 나눌 때 비용 최소화, 또는 정확히 \(k\)개의 작업을 선택. 개수를 상태에 넣으면 \(dp[i][j]\) 처럼 차원이 하나 늘어 \(O(nk)\) 이상이 든다. Aliens 트릭(WQS 이분 탐색, 라그랑주 완화)은 이 제약을 벌점(penalty) 으로 바꿔 차원을 없앤다.
라그랑주 완화
"정확히 \(k\)개를 골랐을 때의 최적값"을 \(g(k)\) 라 하자. 각 선택(구간 하나, 작업 하나)에 벌점 \(\lambda\) 를 부과하면, 제약 없는 DP
$$ h(\lambda) = \min_{\text{선택 개수 } c}\big( g(c) + \lambda\, c \big) $$
를 빠르게 풀 수 있다(개수 차원이 사라짐). 이때 최적해가 사용한 개수 \(c^*(\lambda)\) 는 \(\lambda\) 가 커질수록 단조 감소한다(벌점이 세지면 적게 고른다). 따라서 \(c^*(\lambda)=k\) 가 되도록 \(\lambda\) 를 이분 탐색 하면 된다. 답은
$$ g(k) = h(\lambda^*) - \lambda^* k. $$
볼록성 조건
이 방법이 옳으려면 \(g(k)\) 가 \(k\) 에 대해 볼록(또는 오목) 해야 한다. 볼록하면 \(g(k)+\lambda k\) 의 기울기 부호로 \(k\) 를 이분할 수 있다. 볼록성은 보통 "구간을 하나 더 쪼갤 때 이득이 체감한다"는 문제 구조에서 나온다. 증명이 어렵다면 작은 입력으로 \(g(k)\) 의 차분 \(g(k+1)-g(k)\) 가 단조인지 확인한다.
동점(tie) 처리
\(\lambda\) 가 정수 격자에 걸리면 최적 개수가 한 값이 아니라 구간 \([c_{lo}, c_{hi}]\) 이 될 수 있다. 이때 \(k\) 가 그 구간에 들면 답을 복원할 수 있다. 구현에서 "개수가 같으면 더 많은(또는 적은) 개수를 선호" 하도록 타이브레이크를 두어 \(c^*\) 의 단조 경계를 만든다.
복잡도
\(\lambda\) 이분이 \(O(\log(\text{값 범위}))\), 각 평가가 무제약 DP 비용 \(T\) 이므로 전체 \(O(T\log V)\). 개수 차원 \(k\) 가 통째로 빠지는 것이 이득이다.
| 직접 DP | Aliens 트릭 |
|---|---|
| \(O(nk)\) 또는 그 이상 | \(O(T\log V)\), \(T\) = 무제약 DP |