# 1. Tóm tắt đề bài Cho dãy $nums$, tìm độ dài dãy con tăng nghiêm ngặt dài nhất. ### Giới hạn $1 \le nums.length \le 2500$ $-10^4 \le nums[i] \le 10^4$ # 2. Hướng giải Có 2 cách: cách 1 là dp, cách 2 là dp kết hợp chặt nhị phân. # 3. Cách giải Cách 1: Gọi $dp(i)$ là độ dài dãy con tăng nghiêm ngặt dài nhất kết thúc ở $i$. Ta sẽ có: $dp(i) = max(dp(j)) + 1$ với mọi $j$ sao cho $nums[j] < nums[i]$. Cách 2: Gọi $dp(i)$ là giá trị của phần tử cuối cùng của dãy con tăng nghiêm ngặt độ dài $i$. Để cập nhật dp, tại mỗi vị trí $nums[i]$ ta tìm vị trí $j$ trên mảng $dp$ sao cho $dp(j) < nums[i]$ và $j$ max. Sau đó, ta cập nhật vị trí $dp(j+1) = min(dp(j+1), nums[i])$. Công thức dp kia sẽ có nghĩa: Lấy xâu con dài nhất có thể (là độ dài $j$ ta tìm) mà có thể ghép $nums[i]$ vào cuối dãy, ta được 1 xâu con tăng dài nhất kết thúc tại $nums[i]$ và có độ dài $j+1$. Vì thế, ta cập nhật vào $dp(j+1)$. Với công thức và định nghĩa như trên, ta sẽ có: $dp(i) > dp(i-1) > dp(i-2)...$ Chứng minh thì mọi người có thể tự làm. Và vì thế ta có thể chặt nhị phân trên dãy $dp$ để tìm $j$, giảm độ phức tạp bài toán xuống. ### Độ phức tạp thuật toán Thời gian: Cách 1: $O(n^2)$ Cách 2: $O(n\log{n})$ ### Code: [Cách 2](https://leetcode.com/problems/longest-increasing-subsequence/submissions/1137239642/) # 4. Nhận xét Bài này là 1 bài toán kinh điển trong làng dp, mình nghĩ ai cũng đã biết rùi và sẽ ko đọc tutorial này của mình đâu ( .\_.). Các bạn có thể đọc thêm tại: https://www.geeksforgeeks.org/longest-increasing-subsequence-dp-3/ https://www.geeksforgeeks.org/longest-monotonically-increasing-subsequence-size-n-log-n/ https://cp-algorithms.com/sequences/longest_increasing_subsequence.html