BEADSNB - Chuỗi ốc

Tags: lis, dp

Problem

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

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

Biển Đà Nẵng được nhiều du khách biết đến như một trong những điểm nghỉ ngơi lý tưởng và được tạp chí Forbes (Mỹ) bình chọn là một trong những bãi biển đẹp nhất thế giới. Các bãi tắm có độ dốc lớn, nước trong xanh thích hợp cho những du khách muốn thưởng thức các loại hình dịch vụ giải trí nghỉ dưỡng, câu cá, lướt ván, lặn ngắm san hô, du thuyền,..

Trong một đợt đi du lịch ở Đà Nẵng, sáng sớm DONG3D thường đi dạo dọc bờ biển và nhặt những vỏ ốc rồi xâu chúng lại thành một chuỗi. Nguyên tắc tạo chuỗi ốc của DONG3D như sau: Ban đầu từ chuỗi rỗng, không có vỏ ốc; khi gặp một vỏ ốc mới, có thể lấy để xâu vào một trong hai đầu của chuỗi hoặc hoặc bỏ đi không lấy; cuối cùng nhận được một chuỗi vỏ ốc mà tính từ đầu chuỗi đến cuối chuỗi, các vỏ ốc có kích thước tăng dần và gồm càng nhiều vỏ ốc càng tốt.

Yêu cầu

Cho trước dãy 𝑎1, 𝑎2, … , 𝑎𝑛 là kích thước của các vỏ ốc mà DONG3D lần lượt gặp khi đi dọc bờ biển, hãy tìm cách nhặt và xâu chuỗi để được chuỗi gồm nhiều vỏ ốc nhất.

Dữ liệu

Dòng 1 chứa số nguyên dương 𝑛 ≤ 105 Dòng 2 chứa 𝑛 số nguyên dương 𝑎1, 𝑎2, … , 𝑎𝑛 (∀𝑖: 𝑎𝑖 ≤ 109) cách nhau bởi dấu cách.

Kết quả

Một số nguyên duy nhất là số lượng vỏ ốc trong chuỗi tạo được.

Example

Input
5
4 4 5 3 1

Output
4

Tutorial

Giả sử ta lấy vỏ ốc thứ i đầu tiên thì từ vỏ ốc thứ i+1 trở di đến vỏ ốc thứ n, nếu kích thước lớn hơn vỏ thứ i thì xâu vào phía sau còn nếu kích thước nhỏ hơn vỏ thứ i thì xâu vào phía trước.

Thuật toán: với mỗi vị trí i ta tìm độ dài dãy con tăng dài nhất (LIS) bắt đầu từ vị trí i và dãy con giảm dài nhất (LDS) bắt đầu từ vị trí i. Kết quả là max(LIS + LDS - 1) với mỗi vị trí i.


Submission

BEADSNB.cpp