https://www.acmicpc.net/problem/9251
두 문자열의 LCS의 길이를 구하는 문제다.
LCS(Longest Common Subsequence)는 최장 공통 부분 문자열이다.
Subsequence는 Substring과 다르게 연속되지 않은 수열이다.
다만 수열이기 때문에 순서는 따라야한다.
ACBK 와 TBCK 가 있을 때 LCS는 BK 다.
LCS는 DP로 구할 수 있다.
이렇게 왼쪽, 위쪽을 참고해야하기 때문에 편의상 배열에서 1열과 1행은 0으로 깔아준다.
#include <iostream>
#include <algorithm>
using namespace std;
char s1[1001], s2[1001];
int dp[1001][1001], i, j;
int main()
{
scanf("%s %s", s1 + 1, s2 + 1);
for (i = 1; s1[i]; i++)
{
for (j = 1; s2[j]; j++)
{
dp[i][j] = max({dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1] + (s1[i] == s2[j])});
}
}
cout << dp[i - 1][j - 1] << "\n";
}