見出し画像

アルゴリズム道中記〜最長共通部分列〜

#include <bits/stdc++.h>
#define print(x) cout << x << endl;
#define rep(i, s, n) for (long long i = s; i < (long long)(n); i++)
using namespace std;
using ll = long long;

int main() {
  string S, T;
  cin >> S >> T;
  S.insert(0, " "); T.insert(0, " ");
  vector<vector<int>> dp(T.size(), vector<int>(S.size()));
  rep (i, 1, T.size())
  {
    rep (k, 1, S.size())
    {
      if (T[i] == S[k])
      {
        dp[i][k] = max(
            dp[i-1][k],
            max(
              dp[i][k], dp[i-1][k-1]+1
              )
            );
      }
      else
        dp[i][k] = max(dp[i-1][k], dp[i][k-1]);
    }
  }
  print(dp[T.size()-1][S.size()-1]);
}

全くもってわからない問題でした。結局、

上のコードを拝見し、それを実装しました。ただ、それだけでは悔しいですので、一度まっさらな状態で一からもう一回コードを書きました。

この記事が気に入ったらサポートをしてみませんか?