LNACS - Dãy con chung không liền kề dài nhất

Tags: dp

Problem

https://vn.spoj.com/problems/LNACS

https://oj.vnoi.info/problem/LNACS

Dãy C = c1, c2, …, ck là dãy con không liền kề của dãy A = a1, a2, …, am nếu C có thể nhận được bằng cách chọn một dãy các phần tử không liền kề của A, nghĩa là tìm dược dãy các chỉ số i1, i2, …, ik sao cho:

1 ≤ i1, i2, …, ik ≤ m;
i1 < i2 - 1, i2 < i3 - 1, …, ik - 1 < ik - 1;
c1 = ai1, c2 = ai2, ck = aik.

Ta gọi độ dài của dãy số là số phần tử của nó.

Cho hai dãy:
A = a1, a2, …, am

B = b1, b2, …, bn

Dãy C được gọi là dãy con chung không liền kề của hai dãy A và B nếu như nó vừa là dãy con không liền kề của A, vừa là dãy con không liền kề của B.

Yêu cầu

Cho hai dãy số A và B. Hãy tìm độ dài của dãy con chung không liền kề dài nhất của hai dãy đã cho.

Dữ liệu

  • Dòng đầu tiên chứa hai số nguyên dương m và n (2 ≤ m, n ≤ 10^3) được ghi cách nhau bởi dấu cách, lần lượt là số lượng phần tử của dãy A và dãy B.
  • Dòng thứ i trong m dòng tiếp theo chứa số nguyên không âm ai (ai ≤ 10^4), i = 1, 2, …, m.
  • Dòng thứ j trong n dòng tiếp theo chứa số nguyên không âm bj (bj ≤ 10^4), j = 1, 2, …, n.

Kết quả

Ghi ra trên một dòng duy nhất độ dài của dãy con chung không liền kề dài nhất của hai dãy A và B.

Ví dụ

Input:
4 5
4
9
2
4
1
9
7
3
4

Output:
2

Tutorial

Gọi F[i][j] là dãy con chung không liền kề dài nhất của hai dãy a[1->i] với b[1->j]. Khởi tạo F[1][] với F[][1]. Tính F[i][j].

Nếu a[i] != b[j] thì F[i][j] = max(F[i-1][j], F[i][j-1]).

Nếu a[i] == b[j] thì F[i][j] = F[i-2][j-2] + 1. Nhưng do đây là i-2, j-2 nên (dùng linh cảm nhiều hơn) có thể F[i][j-1] với F[i-1][j] lớn hơn giá trị này nên tốt nhất tối ưu thêm max(F[i-1][j], F[i][j-1]) cho chắc.


Submission

LNACS.cpp