"문제가 문자열 두 개나 아이템과 예산처럼 두 축을 한꺼번에 다루기 시작하면, 상태도 숫자 두 개짜리 격자가 돼. 편집 거리와 LCS는 맞춤법 제안, diff, DNA 서열 비교를 떠받치는 기초 일꾼이야. 제품 전체가 이 표 하나로 돌아간다는 뜻은 아니지만, 이 격자 없이는 서지 못할 물건이 수두룩해."
상태의 두 차원
2D DP는 부분 문제가 숫자 쌍으로 식별되는 DP야. 그래서 테이블이 격자가 되지. 가장 흔한 모양은 수열 두 개를 놓고 dp[i][j]가 'A의 첫 i개와 B의 첫 j개'에 관한 질문에 답하는 꼴이야. dp[i][w]를 '예산 w 안에서 첫 i개 아이템을 쓴 결과'로 두는 꼴도 있고. 각 칸은 위, 왼쪽, 대각선 같은 이웃 값들로 계산되고, 그 이웃들이 필요한 시점에 준비돼 있도록 격자를 보통 행 단위로 채워.
편집 거리: 정석 2D DP
두 문자열 사이의 편집 거리, 즉 Levenshtein 거리는 한 문자열을 다른 문자열로 바꾸는 데 필요한 최소한의 단일 문자 삽입, 삭제, 치환 횟수야. dp[i][j]를 A의 첫 i글자와 B의 첫 j글자 사이의 편집 거리로 정의해. 그러면 점화식이 결정문처럼 읽혀. 현재 문자가 일치하면 편집이 필요 없으니 dp[i][j] = dp[i-1][j-1]. 일치하지 않으면 세 가지 선택, 즉 삭제(dp[i-1][j]), 삽입(dp[i][j-1]), 치환(dp[i-1][j-1]) 가운데 최소에 1을 더해. 이웃 셋에 min 하나. 문자열을 빈 문자열로 바꾸는 비용은 그 길이라는 base case가 첫 행과 첫 열을 채워 주고.
편집 거리가 떠받치는 세상
편집 거리와 LCS는 맞춤법 제안, 퍼지 매칭, diff, 생물정보학의 서열 비교를 이해하는 데 중요한 기초야. 다만 실제 제품은 성능과 품질을 위해 Myers diff, 토큰화, 휴리스틱, 도메인별 점수 같은 기법을 함께 써. 0/1 배낭도 마찬가지로 예산과 자원 할당을 모델링하는 출발점이지, 모든 현실 시스템 뒤에 숨은 단일 엔진은 아니야.
피파의 고백
dp[3][2]는 'A의 첫 3글자를 B의 첫 2글자로 바꾸는 비용'이야. 칸마다 문장이 생기니까 세 갈래 min이 공식이기를 멈추고 명백한 세 가지 선택이 됐어. 삭제, 삽입, 치환. 그 뒤로 모든 2D DP를 풀어 준 트릭은 하나야. dp[i][j]가 정확히 뭘 나타내는지 평범한 말로 할 수 있을 때까지 점화식 쓰기를 거부하는 것.