給定一個整數序列,求其中最長的遞增子序列的長度是多少?
給定一個由字母組成的字符串,求其中最長的遞增子序列的長度是多少?
給定一個浮點數序列,求其中最長的遞增子序列的和是多少?
給定一個二維整數矩陣,求其中最長的遞增子序列的和是多少?
給定一個由整數構成的有向圖,求其中最長的遞增子序列的長度是多少?
Longest Increasing Subsequence(最長上升子序列)是指在一個序列中找到一個子序列,使得該子序列中的元素依次遞增,且該子序列的長度最長。例如,序列 [3, 5, 2, 7, 1, 4, 8] 的最長上升子序列為 [3, 5, 7, 8]。
求最長上升子序列的常見方法是使用動態規劃,以下為一個簡單的動態規划算法:
例如,對於序列 [3, 5, 2, 7, 1, 4, 8],可以使用上述算法求解最長上升子序列。具體步驟如下:
定義:Longest Increasing Subsequence(LIS)指數列中最長的遞增子序列。例如,對於數列{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5},其LIS為{1, 2, 5, 6, 9},長度為5。
LIS的求解方法:常用的求解LIS的方法有暴力搜索、動態規劃、貪心、二分查找等。
動態規劃法:將LIS的求解問題分解成子問題,使用動態規劃求解,時間複雜度為O(n^2)。
貪心法:通過選擇適當的元素構造LIS,時間複雜度為O(nlogn)。
二分查找法:通過維護一個升序序列,並不斷更新,來求解LIS,時間複雜度為O(nlogn)。
應用:LIS問題廣泛應用於各種實際問題中,如最長上升子序列、最長下降子序列、最長不下降子序列等。
LeetCode 300 - Longest Increasing Subsequence
給定一個未排序的整數數組,找到最長遞增子序列的長度。
例如:
Input:[10,9,2,5,3,7,101,18]
Output:4
Explanation:
最長的遞增子序列是 [2,3,7,101],因此長度為 4。
GeeksforGeeks - Longest Increasing Subsequence
給定一個整數數列,找到其中的最長遞增子序列。
例如:
Input:[3, 10, 2, 1, 20]
Output:3
Explanation:
最長的遞增子序列是 [3, 10, 20],因此長度為 3。
SPOJ - Increasing Subsequences
給定一個整數數列,找出有多少個子序列是遞增的。
例如:
Input:[5,2,8,6,3,6,9,7]
Output:8
Explanation:
遞增子序列分別為 [5], [2], [8], [6], [3], [6], [9], [7]。
CodeChef - LISAND - Longest Increasing Subsequence and Non-decreasing Array
給定一個整數數列,找到其中的最長遞增子序列的長度,同時也需要找到能夠使數列變成非遞減的最少操作次數。
例如:
Input:[2, 2, 2, 1, 1, 1, 3, 3, 3]
Output:2 3
Explanation:
最長的遞增子序列是 [2, 3],長度為 2。最少需要執行 3 次操作才能使數列變成非遞減的:將第 4, 5, 6 個數變成 2。
Hackerrank - The Longest Increasing Subsequence of an Array
給定一個整數數列,找到其中的最長遞增子序列,同時需要找到所有符合該要求的最長子序列中,字典序最小的那個。
例如:
Input:[0, 8, 4, 12, 2, 10, 6, 14, 1, 9]
Output:[0, 4, 6, 9, 14]
Explanation:
最長的遞增子序列是 [0, 2, 6, 9, 14] 和 [0, 4, 6, 9, 14],但是前者字典序比後者大,因此輸出後者。