Advertisement
MinhNGUYEN2k4

Untitled

Dec 27th, 2020
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.13 KB | None | 0 0
  1. Nhận xét:
  2.  
  3. Nếu cố định i
  4. Nếu k1 < k2 và A(k1)= A(k2) thì f(k1, i) ≤ f(k2, i).
  5. Chứng minh:
  6.  
  7. Xét k1 < k2 và A(k1)= A(k2).
  8. 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).
  9. 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.
  10.  
  11. // happyboy99x
  12. void solve() {
  13.     memset(pos, -1, sizeof pos); // pos[i] = map(value --> index lớn nhất)
  14.     int res = 0;
  15.     for(int i = 0; i < n; ++i) {
  16.         for(int j = i + 1; j < n; ++j) {
  17.             int p = pos[a[j] - a[i] + ZERO];  // a[j] - a[i] co' the < 0
  18.             if(p != -1) f[i][j] = f[p][i] + 1;
  19.             else f[i][j] = 2;
  20.             res = max(res, f[i][j]);
  21.         }
  22.         pos[a[i] + (MAX << 1)] = i;
  23.     }
  24.     cout << res << "\n";
  25. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement