문제 링크
- http://icpc.me/1256
사용 알고리즘
- DP
시간복잡도
- O(n2)
풀이
꽤 자주 출제되는 DP 유형인 k-th lexicographical string 문제입니다.
a를 i개, z를 j개 쓸 수 있는 상황에서 cnt번째 문자열을 출력해야 한다고 가정을 하고, a를 i-1개, z를 j개 사용해서 만들 수 있는 경우의 수를 avail이라고 정의합시다.
만약 avail이 cnt보다 크다면 z를 출력하고, cnt에서 avail을 뺀 뒤 재귀적으로 다시 연산해줍니다. 반대의 경우에는 a를 출력하면 됩니다. 자세한 구현은 코드를 참고해주시기 바랍니다.
a를 n개, z를 r개 사용해서 만들 수 있는 경우의 수는 (n+1)Hr이기 때문에 중복 조합을 구해주면 됩니다. nHr은 (n+r-1)Cr과 동치입니다.
전체 코드
1 |
|