LIQ - Dãy con tăng dài nhất ( bản dễ )

Tags: dp, lis

Problem

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

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

Cho một dãy số nguyên gồm N phần tử A[1], A[2], … A[N].
Biết rằng dãy con tăng đơn điệu là 1 dãy A[i1],… A[ik] thỏa mãn
i1 < i2 < … < ik và A[i1] < A[i2] < .. < A[ik]. Hãy cho biết dãy con tăng đơn điệu dài nhất của dãy này có bao nhiêu phần tử?

Download test và solution (C/C++, Pascal) tại đây.

Input

  • Dòng 1 gồm 1 số nguyên là số N (1 ≤ N ≤ 1000).
  • Dòng thứ 2 ghi N số nguyên A[1], A[2], .. A[N] (1 ≤ A[i] ≤ 10000).

Output

Ghi ra độ dài của dãy con tăng đơn điệu dài nhất.

Ví dụ

Input
6
1 2 5 4 6 2 

Output
4

Giải thích test ví dụ: Dãy con dài nhất là dãy A[1] = 1 < A[2] = 2 < A[4] = 4 < A[5] = 6, độ dài dãy này là 4.

Gợi ý: Sử dụng phương pháp Quy Hoạch Động. F[i]: Độ dài dãy con đơn điệu tăng dài nhất mà phần tử cuối cùng là số A[i] này.


Tutorial

Gọi F[i] là độ dài dãy con tăng dài nhất tận cùng là phần tử thứ i. Khởi tạo F[i] = 1 với mọi 1 <= i <= n. (là dãy chỉ gồm một phần tử là chính nó). Công thức QHĐ : F[j] = max(F[i]+1) với i < j và a[i] < a[j].

Tạo thêm một phần tử cực đại sau cùng để thu được độ dài dãy dài nhất trong dãy. Thuật này có ĐPT O(n^2).

Lưu ý : nếu muốn xuất ra một dãy bất kì có độ dài của dãy con tăng dài nhất thì dùng một mảng truy vết.


Submission