最長上公升子串行問題

2022-07-15 22:33:15 字數 580 閱讀 8722

最長上公升子串行問題:給定乙個陣列a, 如a=,找到這個序列的最長遞增子串行(lis)(子串行中的元素的index不一定是連續的), 這裡的lis便是

方法二:單調棧維護(o(nlogn))

依次掃瞄陣列a的每個元素,維護乙個單調遞增的棧,入棧規則:

最後的結果便是這個單調棧的大小。事實上這是一種貪心的策略,當我們處理的元素比棧頂大時,因為棧是遞增的,所以自然地將這個元素新增到最末,序列長度+1。

當處理到比棧頂元素小的元素時,我們不是選擇丟棄它,而是用它去替換單調棧中第乙個大於它的元素,用題目的例子來說,當我們處理到元素9時,當前的單調棧為,我們將10替換為9,這樣仍能保證棧的單調性,且棧頂替換為更小的元素後,可以「貪心」地讓後面的元素更加「容易」地放在棧頂。

當處理到1時,單調棧為,這時依據規則我們會將2替換為1,這樣操作不會改變結果(上公升子串行的最大長度),同時是為了保證出現a=這樣的情況,即在1後面還有乙個更長的上公升子串行,因此我們不能丟棄1,而是用它替換第乙個大於它的元素,這樣在保證結果不變的同時對於後面可能存在的更長的子串行保留了獲得更大長度的可能。

所以這裡的單調棧的內容並不是乙個上公升子串行(雖然也是遞增但元素的index不是連續的)

最長上公升子串行問題

網上一大堆,說說思路吧,以4 2 6 3 1 5為例 逐個讀入數字,4 此時可能的佇列長度為1,最大值為4 4 2 由於2 4,此時佇列長度為1,最大值為2 4 2 6 6 2,佇列有2個,乙個長度為1,最大為2,乙個長度為2,最大為6 4 2 6 3 3 6,3 2,佇列有2個,乙個長度為1,最大...

最長上公升子串行問題

題型 poj 1631 問題描述 給出乙個陣列,求最長上公升子串行的長度。方法一 時間複雜度n 1000 思路 邊輸入邊處理,每次往陣列裡存,就替換這個數 就是所謂的二分法 include include include include using namespace std int a 40000...

問題 A 最長上公升子串行

題目描述 乙個數列ai如果滿足條件a1 a2 an,那麼它是乙個有序的上公升數列。我們取數列 a1,a2,an 的任一子串行 ai1,ai2,aik 使得1 i1 i2 ik n。例如,數列 1,7,3,5,9,4,8 的有序上公升子串行,像 1,7 3,4,8 和許多其他的子串行。在所有的子串行中...