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.
- 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
Nếu bạn thấy bài viết này hay, hãy share bài viết này cho mọi người nhé 😉.
Share this post →