코스

DP Master

상태 정의부터 배낭, 문자열, 트리, 비트마스크, 자릿수 DP와 최적화까지 설명과 확인 문제를 실제 Judge 문제 사이에 배치한 과정입니다.

Level 3 → Level 8 156 아이템 100 문제 23 강의 13 확인 문제
코스 진행도 0%
0 / 156 아이템 완료
01
Level 3 · Explorer

DP 기본 사고

상태의 의미, 초기값, 마지막 행동과 계산 순서를 익힌다. 피보나치형 문제의 반복을 줄이고 경우의 수, 최솟값, 최댓값, 도달 불가능 상태, 기본 격자 경로와 Top-down/Bottom-up을 서로 다른 문제에서 연습한다.

0/18 완료
Lesson DP란 무엇인가 큰 문제를 겹치는 작은 상태로 나누는 사고 필수 7m 현재

핵심 생각

동적 계획법은 같은 부분 문제의 답을 한 번만 계산해 재사용하는 방법이다. 재귀를 썼다는 사실만으로 DP가 되는 것은 아니다. 서로 다른 선택 경로가 같은 상태에 도착하고, 그 상태 이후의 답이 과거 경로와 무관할 때 재사용할 수 있다.

문제를 읽으며 적을 세 문장

  1. dp[state]가 정확히 무엇을 뜻하는가?
  2. 현재 상태로 오는 마지막 행동은 무엇인가?
  3. 더 작은 상태의 답으로 현재 답을 만들 수 있는가?

예를 들어 계단 i에 도착하는 마지막 행동이 1칸 또는 2칸 이동이라면, ways[i] = ways[i-1] + ways[i-2]가 자연스럽게 나온다. 이때 점화식보다 먼저 “ways[i]는 i번째 계단에 정확히 도착하는 방법 수”라고 정의해야 한다.

자주 하는 실수: 입력의 위치와 DP 상태를 같은 것으로 생각하거나, 서로 다른 조건의 상태를 하나로 합쳐 미래 전이가 달라지는 경우를 놓친다.

Check question 중복 부분 문제 찾기 필수 3m
재귀 호출에서 메모이제이션이 가장 직접적으로 줄이는 것은 무엇인가요?
예제 피보나치 Top-down 호출 구조 같은 호출이 어디에서 반복되는지 단계별로 확인한다 필수 5m

fib(5)를 계산하면 fib(3) 같은 상태가 여러 경로에서 다시 등장한다. 메모이제이션 전후의 호출 흐름을 비교해 보자.

1 / 1
Check question 메모이제이션의 역할 필수 3m
Top-down DP에서 캐시에 값이 이미 있다면 무엇을 해야 하나요?
기초 문제 피보나치 수열 필수 30m
R01495

피보나치 수열

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Lesson 상태를 문장으로 정의하기 dp[i]의 의미가 전이를 결정한다 필수 7m

상태 정의의 네 요소

dp[i]처럼 기호만 적으면 의미가 부족하다. 상태 문장에는 처리한 범위, 마지막 위치나 조건, 저장하는 값, 최적화 방향이 들어가야 한다.

  • 모호함: dp[i] = i까지의 답
  • 명확함: dp[i] = 앞의 i개 원소를 처리했을 때 얻는 최대 점수
  • 끝점 상태: dp[i] = i번째 원소를 반드시 선택하고 끝나는 최대 점수

두 번째와 세 번째 정의는 비슷해 보이지만 정답을 읽는 위치가 다르다. 끝점 상태라면 전체 정답은 보통 max(dp[i])다.

상태를 줄이는 기준

서로 다른 과거 두 개가 앞으로 가능한 선택과 이후 비용이 완전히 같다면 하나의 상태로 합칠 수 있다. 반대로 마지막 색, 사용한 특별 행동, 연속 선택 길이가 미래를 바꾸면 반드시 별도 축으로 남긴다.

Check question 올바른 상태 정의 필수 3m
선형 배열의 앞부분을 처리하는 최대화 DP에서 가장 명확한 정의는 무엇인가요?
기초 문제 Min Cost Climbing Stairs 필수 30m
R02894

Min Cost Climbing Stairs

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Lesson 초기값과 도달 불가능 상태 0은 값인지, 아직 도달하지 못했다는 표시인지 구분한다 필수 7m

초기 상태는 증명의 시작점

초기 상태는 단순한 코딩 편의가 아니라 점화식이 참이기 시작하는 근거다. 경우의 수에서는 아무것도 고르지 않는 빈 구성을 dp[0]=1로 두는 경우가 많다. 이 1이 이후 첫 선택을 만드는 출발점이 된다.

최솟값 DP는 도달 불가능 상태를 INF로 두고, INF + cost가 overflow하지 않도록 갱신 전에 도달 여부를 확인한다. 최댓값 문제에 음수가 있다면 0을 불가능 표시로 쓰면 존재하지 않는 빈 경로가 실제 답보다 커질 수 있다.

제출 전 확인

  • 빈 입력이나 길이 1 상태가 점화식과 일치하는가?
  • 정확히 합을 만들어야 하는 상태를 0으로 초기화하지 않았는가?
  • long long 범위에서 INF와 비용의 합이 안전한가?
  • Top-down의 미방문 표시와 실제 정답 값이 충돌하지 않는가?
기초 문제 별사탕 줍기 필수 30m
R01337

별사탕 줍기

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Unique Paths 필수 30m
R02902

Unique Paths

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 1, 2, 3 더하기 필수 30m
R01496

1, 2, 3 더하기

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 바닥 타일 채우기 필수 30m
R00162

바닥 타일 채우기

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Practice problem 1로 만들기 필수 30m
R00747

1로 만들기

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Maximum Path Sum in Grid 필수 30m
R03334

Maximum Path Sum in Grid

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Triangle Minimum Path Sum 필수 30m
R03137

Triangle Minimum Path Sum

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Number of Derangements 필수 30m
R03478

Number of Derangements

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Checkpoint DP 기본 사고 확인 필수 3m
최솟값 DP의 도달 불가능 상태에 가장 안전한 초기값은 무엇인가요?
02
Level 4 · Challenger

선형·유한 상태 DP

배열이나 문자열을 왼쪽부터 한 번 처리하며 미래에 필요한 상수 개의 상태만 남긴다. 선택/비선택, 연속 길이, 마지막 상태, 최대·최소 동시 저장, 최대 한 번의 전략 변경, 최솟값과 경우의 수 동시 관리, parent를 이용한 최적 상태열 복원을 다룬다. 모든 문제는 O(N) 또는 O(N×상수)에 풀리며 입력 크기만큼 커지는 행동 횟수나 용량 축을 사용하지 않는다.

0/18 완료
Lesson 과거 정보를 압축하는 법 미래의 선택에 필요한 정보만 상태로 남긴다 필수 7m

과거 전체 대신 경계만 기억하기

배열을 왼쪽부터 처리할 때 모든 선택 기록을 저장할 필요는 없다. 다음 선택을 결정하는 데 필요한 정보만 last, used, consecutive 같은 작은 축으로 남긴다.

예를 들어 같은 행동을 세 번 연속 할 수 없다면 과거 전체가 아니라 마지막 행동과 현재 연속 길이 0, 1, 2만 필요하다. 특별 행동을 최대 한 번 쓸 수 있다면 used는 0 또는 1이다. 이처럼 상태 수가 입력 크기와 무관한 상수이면 각 위치를 한 번 순회하는 전체 복잡도도 O(N)이다.

핵심 질문: 다음 위치의 가능한 선택과 비용을 결정하려면 과거에서 무엇만 기억하면 되는가?

Check question 미래에 필요한 정보 필수 3m
같은 색을 연속으로 고를 수 없다면 미래를 위해 반드시 기억할 것은 무엇인가요?
기초 문제 Maximum Subarray Sum 필수 30m
R02720

Maximum Subarray Sum

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Lesson 선택과 비선택 마지막 행동이 다음 선택을 제한하는 경우 필수 7m

현재 원소를 선택하는 경우와 선택하지 않는 경우를 분리한다. House Robber처럼 인접 원소를 함께 선택할 수 없다면 다음 두 관점이 모두 가능하다.

  • dp[i] = max(dp[i-1], dp[i-2] + value[i])
  • dp[i][taken] = i까지 처리했고 i의 선택 여부가 taken일 때의 최댓값

첫 표현은 상태를 더 압축했고, 두 번째 표현은 전이의 의미를 더 직접적으로 보여준다. 연속 선택 개수가 2까지 허용되는 식으로 조건이 확장되면 consecutive 축을 추가하는 편이 안전하다.

선택하지 않는 전이를 빼먹으면 이전 최적 상태를 그대로 유지할 수 없고, 반대로 선택 전이에서 제한을 확인하지 않으면 금지된 조합이 답에 포함된다.

기초 문제 House Robber 필수 30m
R02898

House Robber

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Lesson 마지막 상태 저장 색, 모드, 행동처럼 유한한 상태를 추가한다 필수 7m

dp[i][last]는 앞의 i개를 처리했고 마지막 상태가 last일 때의 최적값이다. RGB거리에서는 last가 세 색이고, 비행 모드에서는 일반과 터보처럼 고정된 모드가 된다.

전이는 현재 상태로 들어올 수 있는 이전 상태만 확인한다.

for (int now = 0; now < STATE; ++now)
    for (int prev = 0; prev < STATE; ++prev)
        if (allowed(prev, now)) relax(dp[i][now], dp[i-1][prev]);

STATE가 3이나 5처럼 고정된 상수라면 O(N·STATE²)는 O(N)이다. 다만 입력으로 K가 주어져 상태가 0..K로 늘어나면 더 이상 상수 상태 DP가 아니다.

Check question RGB거리 상태 정의 필수 3m
RGB거리의 적절한 상태는 무엇인가요?
기초 문제 RGB거리 필수 30m
R00760

RGB거리

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
예제 유한 상태 전이 한눈에 보기 이전 모드에서 허용되는 다음 모드만 간선으로 연결한다 필수 5m

터보 모드를 연속해서 사용할 수 없는 두 상태 DP를 살펴본다. 상태 수는 두 개지만 허용되는 전이는 세 개다.

1 / 1
Lesson 최댓값과 최솟값을 함께 저장하기 음수가 부호를 뒤집는 전이를 처리한다 필수 7m

곱셈처럼 음수가 부호를 뒤집는 문제에서는 지금까지의 최댓값만 저장하면 정보가 부족하다. 아주 작은 음수 값이 다음 음수와 곱해져 가장 큰 양수가 될 수 있기 때문이다.

각 위치에서 다음 세 후보를 비교한다.

  1. 현재 값 x에서 새 구간을 시작한다.
  2. 이전 최댓값에 x를 곱해 이어 붙인다.
  3. 이전 최솟값에 x를 곱해 이어 붙인다.

nextMax = max(x, prevMax*x, prevMin*x), nextMin = min(x, prevMax*x, prevMin*x)로 함께 갱신한다. 두 값을 순서대로 덮어쓰지 말고 이전 값을 보존한 뒤 동시에 계산해야 한다.

Practice problem Maximum Product Subarray 필수 30m
R02909

Maximum Product Subarray

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem Binary Strings Without Three Consecutive Ones 필수 30m
R03443

Binary Strings Without Three Consecutive Ones

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem Decode Ways 필수 30m
R02908

Decode Ways

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem Hoof, Paper, Scissors 필수 30m
USACO0259

Hoof, Paper, Scissors

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 순찰 드론의 비행 모드 필수 30m
R03774

순찰 드론의 비행 모드

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 서버 전압 조정 기록 필수 30m
R03775

서버 전압 조정 기록

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Challenge problem Dobra 필수 50m
COCI00111

Dobra

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Checkpoint 유한 상태 DP 확인 필수 3m
`dp[i][used]`에서 used가 0 또는 1이라면 전체 시간복잡도는 보통 무엇인가요?
03
Level 4 · Challenger

전이 탐색·2차원 DP

단순 선형 DP와 배낭 사이의 간격을 메운다. 현재 상태로 올 수 있는 모든 이전 위치나 문자열 분할점을 탐색하고, 두 prefix, 정확한 선택 수와 분할 수처럼 범위가 입력에 따라 달라지는 보조 상태 축을 관리한다. O(N²) LIS, 차이를 상태로 저장하는 DP, 경로 복원과 Egg Drop을 차례로 다룬다.

0/15 완료
Lesson 전이를 탐색해야 하는 순간 바로 이전 상태만으로 충분하지 않을 때 후보를 체계적으로 찾는다 필수 8m

dp[i]를 계산할 때 i-1만 보면 되는지 먼저 확인한다. 마지막으로 선택한 위치나 마지막 분할점이 답을 바꾼다면 j<i인 후보를 탐색해야 한다.

for (int i = 0; i < n; ++i)
    for (int j = 0; j < i; ++j)
        if (can_move(j, i)) dp[i] = max(dp[i], dp[j] + gain(i));

이중 반복문을 쓰기 전에 후보 j가 무엇을 뜻하는지cost(j, i)가 어떤 마지막 행동을 나타내는지 문장으로 적는다.

스스로 설명해 보기

  • j가 마지막 위치인지, 분할점인지, 이전 선택인지 말할 수 있는가?
  • 두 번째 상태 축의 범위가 상수인지 입력에 따라 커지는지 계산했는가?
  • 복원이 필요할 때 어떤 이전 상태를 parent에 기록할지 정했는가?

디버깅 기준: 작은 입력의 모든 후보를 손으로 적고 DP가 같은 후보를 확인하는지 비교한다.

Check question 보조 상태 축 판별 필수 3m
입력으로 최대 변경 횟수 K가 주어질 때 가장 자연스러운 상태는 무엇인가요?
기초 문제 Perfect Squares 필수 30m
R03132

Perfect Squares

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Word Break 필수 30m
R03133

Word Break

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 가장 긴 증가하는 부분 수열 필수 30m
R02002

가장 긴 증가하는 부분 수열

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
예제 O(N²) LIS 표 채우기 각 원소를 마지막 원소로 고정하고 가능한 이전 위치를 모두 확인한다 필수 6m

수열 [3, 1, 4, 2, 5]에서 dp[i]i에서 끝나는 LIS 길이로 둔다.

i 확인할 이전 값 dp[i]
0 3 없음 1
1 1 없음 1
2 4 3, 1 2
3 2 1 2
4 5 3, 1, 4, 2 3

정답은 max(dp[i])이며, dp[n-1]이라고 단정하면 안 된다.

1 / 1
기초 문제 Longest Arithmetic Subsequence 필수 30m
R03134

Longest Arithmetic Subsequence

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Practice problem Count Pattern as Subsequence 필수 30m
R03304

Count Pattern as Subsequence

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 정확히 K개로의 분할 필수 30m
R01491

정확히 K개로의 분할

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Lesson 2차원 상태와 복원 두 prefix, 선택 횟수, parent 배열을 상태 정의와 함께 설계한다 필수 8m

dp[i][j]의 두 축은 각각 무엇을 처리했는지 명확해야 한다. 두 문자열의 앞부분이라면 (i, j)는 두 prefix의 길이이고, 정확히 j개를 골랐다면 두 번째 축은 선택 개수다.

최적값뿐 아니라 실제 경로가 필요하면 갱신할 때 선택한 이전 상태를 parent[state]에 기록한다. 동률 처리 규칙도 복원 결과에 영향을 준다.

구현 순서

  1. 모든 상태를 불가능 값으로 초기화한다.
  2. 현재 상태에 들어올 수 있는 이전 후보만 순회한다.
  3. 값이 좋아질 때 parent도 같은 순간에 갱신한다.
  4. 마지막 상태에서 parent를 역추적하고 결과 순서를 뒤집는다.
Practice problem Longest Common Subsequence 필수 30m
R02900

Longest Common Subsequence

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 부산 관광 필수 30m
KOI00004

부산 관광

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Challenge problem 자동차경주대회 필수 50m
KOI00231

자동차경주대회

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Challenge problem Egg Drop (Minimum Trials) 필수 50m
R03129

Egg Drop (Minimum Trials)

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Checkpoint 전이 탐색·2차원 DP 확인 필수 3m
`dp[i] = min(dp[j] + cost(j,i))`를 모든 j<i에 대해 계산하면 기본 시간복잡도는 무엇인가요?
04
Level 5 · Analyst

배낭 DP

0/1, Subset Sum 가능 여부와 경우의 수, 무한 배낭, 최소 동전, 가치 축, Bounded Knapsack, 정확히 K개, 두 자원 제한을 중복 없이 연습한다. 「트럭 적재 최적화」는 c_i개를 Binary Splitting하고, 「서울에서 경산까지」는 도시와 누적 시간을 상태로 쓰는 종합 배낭 문제다.

0/15 완료
Lesson 배낭 DP의 두 축 물건을 어디까지 보았는지와 사용한 용량을 분리한다 필수 8m

배낭 DP는 보통 물건 선택제한 자원을 함께 관리한다. dp[w]를 정확히 무게 w를 사용한 최적값으로 둘지, w 이하를 사용한 최적값으로 둘지 먼저 결정한다.

0/1 배낭은 한 물건을 같은 단계에서 다시 쓰지 않도록 용량을 큰 쪽에서 작은 쪽으로 갱신한다. 무한 배낭은 작은 쪽에서 큰 쪽으로 갱신해 현재 물건을 다시 사용할 수 있게 한다.

스스로 설명해 보기

  • 각 물건을 0번, 1번, 여러 번, 최대 c번 중 몇 번 쓸 수 있는가?
  • dp[w]는 정확히 w를 쓴 상태인가, w 이하를 쓴 상태인가?
  • 1차원 압축에서 반복 방향이 사용 횟수 조건과 일치하는가?

디버깅 기준: 물건 하나만 있는 입력으로 같은 물건이 의도보다 많이 사용되는지 확인한다.

Check question 0/1 배낭의 반복 방향 필수 3m
무게 w인 물건을 최대 한 번만 사용할 때 1차원 dp의 올바른 용량 순회는 무엇인가요?
기초 문제 0/1 Knapsack 필수 30m
R02897

0/1 Knapsack

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Subset Sum (Reachable?) 필수 30m
R03135

Subset Sum (Reachable?)

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Count Subsets With Given Sum 필수 30m
R03136

Count Subsets With Given Sum

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
예제 Bounded Knapsack의 Binary Splitting 개수 제한을 여러 개의 0/1 묶음으로 변환한다 필수 6m

한 물건을 최대 13개 사용할 수 있다면 1, 2, 4, 6개 묶음으로 나눈다. 각 묶음은 한 번만 선택 가능한 0/1 물건이 된다.

묶음 수는 O(log c)이므로 단순히 1개씩 c번 처리하는 것보다 효율적이다. 마지막 묶음은 남은 개수이며 반드시 2의 거듭제곱일 필요는 없다.

1 / 1
기초 문제 Coin Change (Minimum Coins) 필수 30m
R02896

Coin Change (Minimum Coins)

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Practice problem 무한 배낭 필수 30m
R01494

무한 배낭

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 물약으로 체력 채우기 필수 30m
R00169

물약으로 체력 채우기

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Lesson 정확한 합과 제한 이하의 차이 도달 불가능 상태와 정답을 읽는 위치를 구분한다 필수 8m

정확히 합 W를 만들어야 한다면 dp[0]만 도달 가능하게 초기화하고 나머지는 불가능 상태로 둔다. 용량 W 이하의 최대 가치라면 빈 선택의 가치 0이 모든 용량에서 유효할 수 있다.

가치 기준 배낭, 정확히 K개 선택, 두 자원 제한도 같은 원리로 미래에 필요한 자원을 상태 축에 추가한 것이다.

구현 순서

먼저 2차원 DP로 물건 단계가 분리되는지 확인한 뒤 1차원으로 압축한다. 압축할 때는 현재 단계 값을 같은 단계에서 다시 읽어도 되는지 판단해 반복 방향을 정한다. 정확한 합 문제라면 마지막에 dp[W]의 도달 가능 여부도 별도로 확인한다.

Practice problem 트럭 적재 최적화 필수 30m
R00167

트럭 적재 최적화

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 구슬 무게 합 세기 필수 30m
R00170

구슬 무게 합 세기

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Challenge problem 무게와 부피 두 제약 적재 필수 50m
R00171

무게와 부피 두 제약 적재

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Challenge problem 서울에서 경산까지 필수 50m
KOI00290

서울에서 경산까지

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Checkpoint 배낭 DP 확인 필수 3m
물건을 무한히 사용할 수 있는 최소 동전 DP에서 용량을 정방향으로 갱신하는 이유는 무엇인가요?
05
Level 5 · Analyst

수열·문자열 DP

기본 LIS와 LCS는 3단계에서 끝내고, 최대합 LIS, 공통 부분 문자열, 회문 부분수열, 편집 거리, 실제 LCS 복원과 서로 다른 공통 부분수열 세기로 발전한다. 이후 좌표 압축 자료구조에 (LIS 길이, 개수)를 함께 저장하고, LCIS, Trie 기반 사전 분해, KMP 자동자 상태와 삭제 DP의 결합을 다룬다.

0/15 완료
Lesson 두 수열의 prefix를 상태로 읽기 문자열 DP의 dp[i][j]를 문장으로 해석한다 필수 8m

dp[i][j]는 보통 첫 번째 수열의 앞 i개와 두 번째 수열의 앞 j개를 처리한 답이다. 마지막 원소를 서로 매칭하거나, 한쪽 원소를 버리거나, 양쪽을 모두 처리하는 선택으로 전이가 만들어진다.

LCS, 편집 거리, LCIS는 표의 모양은 비슷하지만 상태의 값과 허용하는 마지막 행동이 다르다.

스스로 설명해 보기

  • dp[i][j]의 i와 j가 각각 어느 prefix를 뜻하는가?
  • 두 원소를 매칭할 때와 한쪽을 버릴 때의 전이를 모두 적었는가?
  • 길이, 개수, 실제 수열 중 무엇을 출력해야 하는가?

디버깅 기준: 빈 문자열, 같은 문자열, 공통 문자가 없는 문자열을 각각 확인한다.

Check question LCS 불일치 전이 필수 3m
A[i-1]과 B[j-1]이 다를 때 기본 LCS 전이는 무엇인가요?
기초 문제 Maximum Sum Increasing Subsequence 필수 30m
R03124

Maximum Sum Increasing Subsequence

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Longest Common Substring 필수 30m
R03125

Longest Common Substring

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Longest Palindromic Subsequence 필수 30m
R03126

Longest Palindromic Subsequence

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
예제 LCS 표에서 실제 수열 복원하기 값을 계산한 뒤 parent 방향을 따라 답을 만든다 필수 6m

문자가 같아 대각선에서 +1된 칸은 해당 문자를 답에 포함할 수 있다. 문자가 다르면 값이 유지되는 위쪽 또는 왼쪽 칸으로 이동한다.

역추적하며 모은 문자는 뒤집어서 출력한다. 동률일 때 어느 방향을 택하는지에 따라 서로 다른 올바른 LCS가 나올 수 있다.

1 / 1
기초 문제 Edit Distance 필수 30m
R02901

Edit Distance

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Practice problem 가장 긴 공통 부분 수열 (LCS) 2 필수 30m
R02029

가장 긴 공통 부분 수열 (LCS) 2

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem DNA 공통 부분 수열의 수 필수 30m
R00187

DNA 공통 부분 수열의 수

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Lesson 길이, 개수, 실제 답은 서로 다른 상태다 같은 최적 길이를 만드는 경우를 합칠 때 중복을 조심한다 필수 8m

최적 길이만 구할 때는 max로 충분하지만 개수를 세려면 같은 결과가 여러 전이에서 중복 집계되는지 확인해야 한다. 실제 답을 출력하려면 parent 또는 역추적 가능한 DP 표가 필요하다.

LIS의 tails 배열은 길이를 빠르게 구하지만 실제 LIS 그 자체는 아니다. 복원하려면 각 원소의 이전 인덱스를 별도로 기록한다.

구현 순서

첫 행과 첫 열을 빈 prefix의 답으로 초기화한다. 이후 마지막 두 원소가 같은 경우와 다른 경우를 분리해 표를 채운다. 복원이 필요하면 답의 끝점에서 시작해 값이 만들어진 방향을 거꾸로 따라가며 선택한 원소를 모은다.

Practice problem 미술관 전시 경로 필수 30m
R01370

미술관 전시 경로

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 최장 공통 증가 부분 수열 (LCIS) 필수 30m
R02704

최장 공통 증가 부분 수열 (LCIS)

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Challenge problem 주문 분해 경우의 수 필수 50m
R01450

주문 분해 경우의 수

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Challenge problem Necklace 필수 50m
USACO0095

Necklace

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Checkpoint 수열·문자열 DP 확인 필수 3m
LIS의 tails 배열에 대한 올바른 설명은 무엇인가요?
06
Level 6 · Strategist

격자·구간 DP

격자 5문제와 구간 5문제로 압축한다. 격자에서는 장애물, 최소 비용, 자원 사용, 최대 정사각형, 양방향 행 sweep을 다룬다. 구간에서는 양 끝 선택, 행렬 곱셈 순서, 인접 합치기, 같은 문자를 합치는 비정형 전이, 마지막 풍선을 정하는 종합 전이로 발전한다.

0/15 완료
Lesson 격자 상태에 필요한 축 찾기 위치만으로 미래가 결정되지 않으면 방향과 자원을 추가한다 필수 8m

기본 격자 DP는 dp[r][c]로 충분하지만, 직전에 이동한 방향이나 벽 제거 사용 여부가 다음 이동을 바꾸면 dp[r][c][direction], dp[r][c][used]가 필요하다.

각 축은 미래 전이에 필요한 정보여야 한다. 단순히 차원을 늘리는 것이 아니라 서로 다른 미래를 갖는 상태만 분리한다.

스스로 설명해 보기

  • 위치 외에 방향이나 자원 사용 여부가 미래 이동을 바꾸는가?
  • dp[l][r]이 참조하는 부분 구간이 먼저 계산되는 순서인가?
  • 첫 행동과 마지막 행동 중 어느 쪽을 고정해야 구간이 독립되는가?

디버깅 기준: 길이 1과 길이 2 구간의 값을 직접 계산해 초기화와 순서를 검증한다.

Check question 구간 DP의 계산 순서 필수 3m
`dp[l][r]`이 더 짧은 구간을 참조한다면 가장 안전한 계산 순서는 무엇인가요?
기초 문제 Unique Paths with Obstacles 필수 30m
R02903

Unique Paths with Obstacles

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Minimum Path Sum 필수 30m
R02904

Minimum Path Sum

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 용암 지형 탐험 필수 30m
R01338

용암 지형 탐험

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
예제 Strange Printer의 같은 문자 합치기 떨어진 같은 문자를 한 번의 출력 구간으로 합치는 비정형 전이 필수 6m

기본값은 첫 문자를 따로 출력하는 1 + dp[l+1][r]이다. s[l] == s[k]인 위치를 찾으면 두 문자를 같은 출력 차례에 처리해 dp[l+1][k-1] + dp[k][r] 형태의 후보를 만들 수 있다.

모든 중간 분할을 단순히 합치는 문제와 달리 같은 문자라는 구조가 전이 수를 줄인다.

1 / 1
기초 문제 Maximal Square 필수 30m
R03130

Maximal Square

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Practice problem 로봇 조종하기 필수 30m
KOI00141

로봇 조종하기

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem Optimal Coin Game 필수 30m
R03460

Optimal Coin Game

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Lesson 구간을 마지막으로 처리하는 선택 중간 분할과 마지막 원소 고정을 구분한다 필수 8m

행렬 곱셈과 인접 합치기는 중간 분할점 k를 고른다. Burst Balloons는 구간에서 마지막으로 터뜨릴 풍선을 고르면 양쪽 부분 문제가 독립된다.

구간 DP가 보이면 먼저 “첫 행동”보다 “마지막 행동”을 고정했을 때 부분 문제가 분리되는지도 확인한다.

구현 순서

구간 길이 1의 기저 상태를 먼저 만든다. 길이를 2부터 증가시키며 각 [l,r]에서 가능한 분할점이나 마지막 선택을 순회한다. 구간 합이 반복해서 필요하면 prefix sum으로 O(1)에 계산해 DP 전이 자체에 집중한다.

Practice problem Matrix Chain Multiplication 필수 30m
R03451

Matrix Chain Multiplication

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 돌 무더기 합치기 (Easy) 필수 30m
R03773

돌 무더기 합치기 (Easy)

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Challenge problem Strange Printer (Minimum Turns) 필수 50m
R03458

Strange Printer (Minimum Turns)

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Challenge problem Burst Balloons (Maximum Coins) 필수 50m
R03453

Burst Balloons (Maximum Coins)

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Checkpoint 격자·구간 DP 확인 필수 3m
Burst Balloons에서 구간의 마지막 풍선을 고정하는 핵심 이유는 무엇인가요?
07
Level 6 · Strategist

트리·DAG DP

DAG 최장 경로와 작업 일정, 트리의 선택/비선택, 독립 집합과 정점 커버, 트리 경로 상태, rerooting, 자식 DP 배열의 배낭식 병합을 익힌다. 대표 상태: dp[u][0] = u를 선택하지 않았을 때, dp[u][1] = u를 선택했을 때, dp[u][k] = u의 서브트리에서 정확히 k개를 선택한 최적값. 트리 DP의 본질은 자식의 답을 먼저 구하고 부모의 답을 계산하는 것이다. 「루트 연결 연구팀」에서는 자식별 상태 배열을 전형적인 배낭 전이로 병합한다. 「두 번째 지름」은 전역 상위 두 경로 후보와 동률을 관리하고, 「두 동강 난 트리의 지름」은 각 자식을 제외한 위쪽 깊이와 지름을 rerooting으로 전달한다.

0/15 완료
Lesson 트리 DP는 postorder DP다 자식의 답을 모아 부모 상태를 계산한다 필수 8m

트리를 한 정점에 루팅하면 각 간선의 방향이 부모와 자식으로 정해진다. 자식을 모두 계산한 뒤 부모를 계산하므로 순환 없이 DP를 수행할 수 있다.

dp[u][0/1]에서 두 번째 축은 정점 u의 선택 여부처럼 부모 전이에 영향을 주는 경계 상태다.

스스로 설명해 보기

  • 부모에게 전달할 자식 서브트리의 경계 정보는 무엇인가?
  • 선택한 부모가 자식의 허용 상태를 어떻게 제한하는가?
  • rerooting에서 현재 자식의 기여를 제외했는가?

디버깅 기준: 정점 하나, 일자 트리, 별 모양 트리에서 각 상태의 의미를 손으로 확인한다.

Check question 선택·비선택 Tree DP 필수 3m
트리 독립 집합에서 u를 선택했다면 자식 v에서 허용되는 상태는 무엇인가요?
기초 문제 Subtree Size 필수 30m
R03145

Subtree Size

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 DAG의 가장 긴 경로 필수 30m
R01280

DAG의 가장 긴 경로

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 마을 경비대 배치 필수 30m
R01373

마을 경비대 배치

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
예제 Tree Knapsack 자식 병합 자식별 dp 배열을 작은 배낭 문제처럼 합친다 필수 6m

dp[u][k]를 u의 서브트리에서 정확히 k개를 고른 최적값으로 둔다. 자식 v를 합칠 때 기존에 a개, v의 서브트리에서 b개를 고르는 모든 조합을 확인한다.

next[a + b] = max(next[a + b], dp[u][a] + dp[v][b]);

아직 합치지 않은 자식의 상태를 섞지 않도록 임시 배열을 사용한다.

1 / 1
기초 문제 사회망 서비스(SNS) 필수 30m
KOI00133

사회망 서비스(SNS)

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Practice problem 건설 일정 필수 30m
R00214

건설 일정

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 모든 도시까지의 거리 합 필수 30m
R01374

모든 도시까지의 거리 합

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Lesson rerooting으로 위쪽 정보 전달하기 한 루트의 서브트리 답을 모든 정점의 답으로 확장한다 필수 8m

첫 DFS에서 아래쪽 기여를 계산하고, 두 번째 DFS에서 부모 방향의 기여를 자식에게 전달한다. 자식 v에게 값을 보낼 때는 v가 만든 기여를 제외해야 한다.

이를 빠르게 하려면 자식 기여의 최댓값 두 개, prefix/suffix 합처럼 “한 자식을 제외한 전체”를 계산할 구조를 준비한다.

구현 순서

부모 배열과 DFS 순서를 먼저 만든 뒤 역순으로 자식 DP를 계산한다. rerooting은 아래쪽 값을 만든 첫 순회와 위쪽 값을 전달하는 두 번째 순회로 분리한다. Tree Knapsack은 자식 하나를 합칠 때마다 임시 배열을 새로 만들고 유효한 선택 개수 범위만 순회한다.

Practice problem 두 번째 지름 필수 30m
R01275

두 번째 지름

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 모든 마을까지의 거리 합 필수 30m
R00407

모든 마을까지의 거리 합

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Platinum III 플래티넘 III 지금 풀기
Challenge problem 두 동강 난 트리의 지름 필수 50m
R01278

두 동강 난 트리의 지름

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Challenge problem 루트 연결 연구팀 필수 50m
R03776

루트 연결 연구팀

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Checkpoint 트리·DAG DP 확인 필수 3m
rerooting에서 자식 v에게 부모 방향 정보를 전달할 때 반드시 해야 하는 것은 무엇인가요?
08
Level 7 · Specialist

비트마스크·상태압축 DP

집합 상태, 작업 배정, 마지막 원소를 기억하는 TSP와 경로 수, 부분집합 분할, 모든 정점 방문 최단 거리, 완전 매칭과 사이클 중복 제거, 행 프로필을 연습한다. 대표 상태: dp[mask], dp[mask][last]. 「연구실 좌석 배치」에서는 dp[row][mask]로 이전 행과 현재 행의 호환성을 검사한다. 시간복잡도 O(2^N), O(N·2^N), O(N²·2^N), 모든 부분마스크 순회 O(3^N)를 입력 제한과 함께 계산한다.

0/15 완료
Lesson 집합을 하나의 정수로 압축하기 mask의 각 비트를 선택 여부로 읽는다 필수 8m

원소 수가 작을 때 집합을 비트마스크로 표현하면 방문 집합이나 선택 집합을 배열 인덱스로 사용할 수 있다. mask | (1<<x)는 x를 추가하고, mask & (1<<x)는 포함 여부를 검사한다.

dp[mask]에 집합만으로 미래가 결정되는지, 마지막 위치까지 필요한지 구분하는 것이 첫 설계 단계다.

스스로 설명해 보기

  • mask의 켜진 비트는 처리 완료인가, 아직 남은 원소인가?
  • 같은 mask라도 마지막 위치가 다르면 미래 비용이 달라지는가?
  • 예상 상태 수와 상태당 전이 수를 곱해 제한 안에 드는가?

디버깅 기준: N=3의 모든 mask를 출력해 빠진 전이와 중복된 순회를 찾는다.

Check question Assignment DP의 popcount 필수 3m
dp[mask]에서 배정된 작업 집합이 mask라면 다음 worker 번호를 어떻게 알 수 있나요?
기초 문제 보석 장식 도안 필수 30m
R01385

보석 장식 도안

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Minimum Cost Assignment 필수 30m
R03466

Minimum Cost Assignment

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 마법 도서관 탐험 필수 30m
R01384

마법 도서관 탐험

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
예제 모든 부분마스크 순회 한 집합을 두 그룹으로 나누는 O(3ᴺ) 전이 필수 6m
for (int sub = mask; sub; sub = (sub - 1) & mask) {
    int other = mask ^ sub;
    // sub와 other를 결합
}

각 원소는 첫 그룹, 둘째 그룹, mask 밖의 세 경우를 가지므로 모든 mask에 대한 부분마스크 순회의 총량은 O(3^N)이다.

1 / 1
기초 문제 Travelling Salesman: Minimum Tour 필수 30m
R03463

Travelling Salesman: Minimum Tour

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Practice problem Number of Hamiltonian Paths 필수 30m
R03465

Number of Hamiltonian Paths

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem Partition Into Allowed Groups 필수 30m
R03473

Partition Into Allowed Groups

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Lesson 마지막 위치와 행 프로필 집합 외에 경계 정보를 추가해야 하는 두 대표 상황 필수 8m

TSP에서는 같은 방문 집합이어도 마지막 정점에 따라 다음 이동 비용이 달라져 dp[mask][last]가 필요하다. 행 프로필 DP에서는 현재 행의 배치와 이전 행의 배치가 호환되는지 검사한다.

마스크는 “전체 선택 기록”이 아니라 미래 전이에 필요한 경계 정보를 압축하는 도구다.

구현 순서

mask의 의미를 주석으로 고정하고 빈 집합의 기저값을 설정한다. 각 전이에서 새 비트를 추가하는지 제거하는지 한 방향만 사용한다. dp[mask][last]라면 last가 mask에 포함된 상태만 유효하다는 불변식도 유지한다.

Practice problem Shortest Walk Visiting All Nodes 필수 30m
R03470

Shortest Walk Visiting All Nodes

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem Minimum Weight Perfect Pairing 필수 30m
R03474

Minimum Weight Perfect Pairing

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Challenge problem 단순 사이클 세기 필수 50m
R01482

단순 사이클 세기

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Challenge problem 연구실 좌석 배치 필수 50m
R03777

연구실 좌석 배치

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Checkpoint 비트마스크 DP 확인 필수 3m
TSP에서 dp[mask]만으로 부족한 이유는 무엇인가요?
09
Level 7 · Specialist

자릿수·게임·확률 DP

금지·포함 숫자 조건부터 자릿수 DP의 위치(pos), 상한 일치 여부(tight), 선행 0 처리(started), 이전 숫자, 사용한 숫자 집합과 값·자릿수 합의 나머지 상태까지 연속해서 익힌다. 이후 승리·패배 게임 DP, DAG 게임, 확률분포 DP와 기댓값 점화식으로 확장하고 Cudak에서 자릿수 합 조건을 종합한다. 대표 상태: dp[pos][tight][started][state], dp[state] = 승리 가능 여부 또는 기대 행동 횟수.

0/15 완료
Lesson Digit DP의 표준 상태 pos, tight, started와 문제별 상태를 분리한다 필수 8m

dp[pos][tight][started][state]에서 pos는 현재 자리, tight는 지금까지 상한과 같은 prefix인지, started는 선행 0을 지나 실제 숫자가 시작됐는지를 나타낸다.

state에는 이전 숫자, 사용 숫자 집합, 자릿수 합이나 값의 나머지처럼 문제 조건에 필요한 정보만 넣는다.

스스로 설명해 보기

  • tight가 0이 되는 정확한 순간을 설명할 수 있는가?
  • 선행 0과 숫자 안의 실제 0을 started로 구분했는가?
  • 문제 조건에 필요한 이전 숫자, 집합, 나머지만 state에 넣었는가?

디버깅 기준: 작은 상한까지 완전 탐색한 결과와 Digit DP의 개수를 비교한다.

Check question started 상태의 역할 필수 3m
Digit DP에서 started가 필요한 가장 중요한 이유는 무엇인가요?
기초 문제 Count Numbers Without the Digit 4 필수 30m
R03506

Count Numbers Without the Digit 4

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Count Numbers Containing the Digit 7 필수 30m
R03513

Count Numbers Containing the Digit 7

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 Count Numbers With No Two Equal Adjacent Digits 필수 30m
R03507

Count Numbers With No Two Equal Adjacent Digits

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
예제 tight 전이 따라가기 상한 527 이하의 수를 왼쪽부터 구성한다 필수 6m

현재 tight=1이고 상한의 현재 자리가 2라면 선택 가능한 숫자는 0~2다. 2를 고르면 다음 tight도 1이고, 0이나 1을 고르면 이후에는 0~9를 자유롭게 고를 수 있어 tight가 0이 된다.

메모이제이션 키에 tight를 빠뜨리면 상한에 붙어 있는 상태와 이미 작은 상태를 잘못 합치게 된다.

1 / 1
기초 문제 Count Numbers With Exactly K Distinct Digits 필수 30m
R03508

Count Numbers With Exactly K Distinct Digits

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Practice problem 이중 배수 수 필수 30m
R01382

이중 배수 수

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem Subtraction Game 필수 30m
R03409

Subtraction Game

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Lesson 게임, 확률, 기댓값도 상태 방정식이다 최적값 대신 승패, 분포, 기대 행동 횟수를 저장한다 필수 8m

게임 DP는 한 번이라도 패배 상태로 이동할 수 있으면 현재를 승리 상태로 둔다. 확률 DP는 전이 확률을 곱해 분포를 합치고, 기댓값 DP는 다음 상태의 기댓값에 한 행동의 비용을 더한다.

자기 자신으로 돌아오는 확률이 있다면 식의 양변을 정리해야 하며, 단순한 위상 순서 DP처럼 바로 대입하면 안 될 수 있다.

구현 순서

숫자를 가장 높은 자리부터 배열로 분리한다. 재귀 인자는 pos, tight, started와 문제별 state만 포함하고, 상한에 더 이상 붙어 있지 않은 상태는 메모이제이션한다. 0 자체를 세는지 여부는 마지막 pos의 반환값에서 명시적으로 처리한다.

Practice problem 게임 그래프 필수 30m
R01464

게임 그래프

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem 주사위 합 확률 필수 30m
R01430

주사위 합 확률

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Challenge problem 연속 앞면 기대값 필수 50m
R01429

연속 앞면 기대값

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Challenge problem Cudak 필수 50m
COCI00053

Cudak

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Checkpoint 자릿수·게임·확률 DP 확인 필수 3m
상한과 같은 prefix를 유지 중인 Digit DP 상태에서 더 작은 숫자를 고르면 tight는 어떻게 되나요?
10
Level 8 · Expert

최적화·종합

Prefix Sum과 Monotone Queue, 격자의 3방향 전이 압축, prefix 합을 이용한 분할 개수 세기, 사분면 재귀 DP, 누적합을 포함한 행렬 거듭제곱, SOS DP를 다룬다. 후반에는 Floyd-Warshall과 구간 비용 DP, 단조 스택과 4방향 직사각형 누적, Divide and Conquer Optimization, Knuth Optimization을 실제 문제로 연결한다. 전부 풀지 못해도 병목 전이가 무엇인지, 단순 O(N²)를 어떤 구조로 줄일 수 있는지 설명할 수 있어야 한다. 최종 문제는 상태 설계, 시간 최적화, 답 복원, 다른 알고리즘 결합, 까다로운 초기값 중 여러 요소를 함께 요구한다.

0/15 완료
Lesson DP 최적화는 병목 전이에서 시작한다 상태 수와 상태당 후보 수를 분리해 계산한다 필수 8m

먼저 정답이 맞는 단순 DP를 설계하고 복잡도를 상태 수 × 전이 후보 수로 분해한다. 시간 초과의 원인이 되는 반복문이 어떤 최솟값, 합, 구간 후보를 계산하는지 확인한다.

Prefix Sum, deque, Divide and Conquer, Knuth, SOS DP는 서로 교환 가능한 마법이 아니다. 각 기법이 요구하는 전이 구조와 단조성 또는 포함 관계를 증명한 뒤 적용한다.

스스로 설명해 보기

  • 기본 DP의 상태 수와 후보 수를 분리해 병목을 찾았는가?
  • 적용하려는 최적화의 단조성 또는 구간 비용 조건을 증명했는가?
  • 최적화 전후가 같은 상태와 초기값을 사용하는가?

디버깅 기준: 느리지만 명확한 기준 풀이와 무작위 작은 입력을 대조한다.

Check question 최적화 전 필수 확인 필수 3m
O(N²) DP를 최적화하기 전에 가장 먼저 해야 할 일은 무엇인가요?
기초 문제 Stamp Collector 필수 30m
R00012

Stamp Collector

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
기초 문제 계산 로봇 필수 30m
KOI00060

계산 로봇

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Silver I 실버 I 지금 풀기
기초 문제 나누기 필수 30m
KOI00071

나누기

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
예제 구간 최솟값을 deque로 유지하기 Sliding Window DP의 후보 집합을 단조 큐로 압축한다 필수 6m

dp[i] = cost[i] + min(dp[j])이고 후보가 i-W ≤ j < i라면 매번 W개를 훑는 대신 deque에 dp값이 증가하는 순서로 후보 인덱스를 유지한다.

창 밖의 인덱스는 앞에서 제거하고, 새 값보다 큰 후보는 뒤에서 제거한다. 각 인덱스가 한 번 들어오고 한 번 나가므로 전체가 O(N)이다.

1 / 1
기초 문제 Slikar 필수 30m
COCI00094

Slikar

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Practice problem 쌍둥이 계단 수열 필수 30m
R01437

쌍둥이 계단 수열

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem AND가 0인 쌍 필수 30m
R00411

AND가 0인 쌍

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Lesson 최적화 조건을 증명하기 D&C, Knuth, SOS DP가 성립하는 구조를 구분한다 필수 8m

Divide and Conquer Optimization은 최적 분할점의 단조성이 필요하다. Knuth Optimization은 더 강한 구간 비용 조건과 최적점 범위를 사용한다. SOS DP는 모든 부분집합 또는 상위집합의 값을 마스크 축별로 전파한다.

조건을 확인하지 않고 기법 이름만 보고 적용하면 빠르지만 틀린 풀이가 된다. 작은 입력의 O(N²) 또는 O(N³) 기준 풀이와 무작위 대조도 좋은 검증 방법이다.

구현 순서

정답이 검증된 기준 DP를 먼저 보존한다. 최적화 버전은 같은 상태 정의와 초기값으로 별도 구현하고 작은 무작위 입력을 수천 번 대조한다. 성능 측정에서는 전체 실행 시간이 아니라 실제 병목 전이의 호출 횟수와 자료구조 연산 수를 확인한다.

Practice problem Moortal Cowmbat 필수 30m
USACO0395

Moortal Cowmbat

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Practice problem Crni 필수 30m
COCI00162

Crni

힌트를 열기 전에 상태와 전이를 먼저 찾아보세요.

Unrated 레이팅 미적용 지금 풀기
Challenge problem 생산 라인 분할 필수 50m
R00406

생산 라인 분할

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Challenge problem 돌 무더기 합치기 (Hard) 필수 50m
R00405

돌 무더기 합치기 (Hard)

이 섹션의 개념을 결합해 보세요. 태그는 숨겨집니다.

Unrated 레이팅 미적용 지금 풀기
Checkpoint 최적화·종합 확인 필수 3m
최적 분할점의 단조성이 증명되지 않았다면 가장 안전한 선택은 무엇인가요?