Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Nhận xét:
- Nếu cố định i
- Nếu k1 < k2 và A(k1) = A(k2) thì f(k1, i) ≤ f(k2, i).
- Chứng minh:
- Xét k1 < k2 và A(k1) = A(k2).
- Giả sử f(k1, i) > f(k2, i), nghĩa là độ dài lớn nhất của dãy B1 kết thúc ở A(k1) và A(i) lớn hơn độ dài lớn nhất của dãy B2 kết thúc ở A(k2) và A(i). Ta thay A(k1) trong dãy B1 thành A(k2). Rõ ràng, dãy mới vẫn đảm bảo tính chất, có độ dài bằng dãy B1, và kết thúc ở A(k2) và A(i).
- Từ nhận xét, khi tính f(i, j), ta chỉ cần tìm chỉ số k lớn nhất, nhỏ hơn i mà A(k) = A(j) - A(i). Từ đó chỉ cần dùng mảng đánh dấu là được.
- // happyboy99x
- void solve() {
- memset(pos, -1, sizeof pos); // pos[i] = map(value --> index lớn nhất)
- int res = 0;
- for(int i = 0; i < n; ++i) {
- for(int j = i + 1; j < n; ++j) {
- int p = pos[a[j] - a[i] + ZERO]; // a[j] - a[i] co' the < 0
- if(p != -1) f[i][j] = f[p][i] + 1;
- else f[i][j] = 2;
- res = max(res, f[i][j]);
- }
- pos[a[i] + (MAX << 1)] = i;
- }
- cout << res << "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement