LCS を求める DP の練習。鉄則本の問題なのでコードのみ。
問題概要
2 つの文字列 が与えられる。
の部分列でも の部分列でもあるような文字列の長さの最大値を求めよ。
制約
コード
#include <bits/stdc++.h> using namespace std; int main() { string S, T; cin >> S >> T; vector dp(S.size()+1, vector(T.size()+1, 0)); for (int i = 0; i <= S.size(); i++) { for (int j = 0; j <= T.size(); j++) { if (i-1 >= 0) dp[i][j] = max(dp[i][j], dp[i-1][j]); if (j-1 >= 0) dp[i][j] = max(dp[i][j], dp[i][j-1]); if (i-1 >= 0 && j-1 >= 0 && S[i-1] == T[j-1]) { dp[i][j] = max(dp[i][j], dp[i-1][j-1] + 1); } } } cout << dp[S.size()][T.size()] << endl; }