AOJ 0572 たのしいカードゲーム
Bから新しい山を作るとき、下から取り除く分は考えずに、
上からn枚取り除いたときのことを考える。
この時できた新しい山とAとの最長の共通列?はO(N)で求まる。
よって全体としてはO(N^2)で計算できる。
#include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 5000; int A, B; int a[MAX_N], b[MAX_N]; int solve(int s){ int i = s; int ret = 0; for(int j = 0; j < A; j++){ if(i >= B) break; if(a[j] == b[i]){ ret++; i++; } } return ret; } int main(){ scanf("%d %d", &A, &B); for(int i = 0; i < A; i++) scanf("%d", a + i); for(int i = 0; i < B; i++) scanf("%d", b + i); int ans = 0; for(int i = 0; i < B; i++){ ans = max(ans, solve(i)); } printf("%d\n", ans); return 0; }