OJ Course Longest Common Subsequence
うるせぇよな。普通に。俺は好きなことを勉強したい。(仲間内のオタク構文) えぬわいです。
続き。
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_10_C&lang=jp
言わずもしれたLCS。
再帰から導いてできるかもと思ったらできなかった。
自分で考えて、漸化式を立ててみた。少し違ってて、ダメだった。惜しいね。もうちょっとDPテーブルの考察が必要だったかも。
蟻本見た。
python で書いた。
落ちた。
c++ で書いた。
通った。南無。
n = int(input()) for i in range(n): a = input() b = input() dp = [[0 for j in range(len(b)+1)] for i in range(len(a)+1)] for i in range(len(a)): for j in range(len(b)): if a[i] == b[j]: dp[i+1][j+1] = max(dp[i+1][j], dp[i][j]+1) else: # ミス dp[i+1][j+1] = max(dp[i+1][j], dp[i][j]) dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]) print(dp[len(a)][len(b)])
#include <iostream> #include <algorithm> using namespace std; int dp[1001][1001]; int main() { int n; cin >> n; for (int k = 0; k < n; k++ ) { string a, b; cin >> a >> b; for (int i = 0; i < a.size(); i++) { for (int j = 0; j < b.size(); j++ ) { if (a[i] == b[j]) { dp[i+1][j+1] = dp[i][j]+1; } else { dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]); } } } cout << dp[a.size()][b.size()] << endl;; } return 0; }