演算法描述》關於LIS的nlogn方法

2022-06-04 22:03:13 字數 1817 閱讀 5711

上次tyvj有一道裸lis,然而我當時直接打了乙個n^2暴力就草草了事,然後就zz了,只拿了60分,其實nlogn的lis和n^2的差的不多,只是沒有n^2,好想罷了,鑑於某學弟的要求,所以就重現一下金哥當年講lis的風範。

首先,lis指的是最長上公升子串行。指的是我們要求出乙個在母序列中找出一些元素,在保證這個子串行上公升的同時,保證這個序列是整個母序列裡滿足這一要求的最長序列。

那麼我們可以直接這樣想,我們要保證當前所拼接的鏈最大,那麼對於每乙個元素來說,可以直接一遍迴圈判斷它能夠屬於哪乙個鏈,使當前以這個元素為結尾的鏈所接的元素個數最多,也就是所得的結果越大。

那麼對於乙個元素ai,可以直接找a1到ai-1的元素中ai鏈在哪乙個元素所得解最優,最優解放在f[i]裡,這種對於所有情況的判斷,很明顯是dp,那麼,轉移方程就是:f[i]=a[j]那麼明顯的,這是乙個n^2的演算法,對於每乙個元素要求以前是否有能夠找到更優解的上一步元素,乙個判斷n遍。

那如何得到乙個更優演算法捏?

其實很簡單,讓我們先回顧剛才我們所做的操作,我們對於當前的乙個元素,找前面所算過的所有結果,試圖找出更優解。我們在做這一工作時,也找了很多肯定不為最優解的元素,這是一件很浪費的事情,那麼我們可以找乙個優化這一過程的方法。

我們知道,對於任意乙個元素,使它的解更優的方案肯定是a[i]小,並且f[i]大的乙個理想元素,因為對於這樣的乙個理想元素,才可能使後面的解更優,而最大的f[i]是有限的,所以,我們很輕易得想到乙個優化方法:

使用乙個陣列d,用d[i]記錄當前  f[i]  為  i  的  a[i]最小的元素,d隨著元素的向後遞推逐漸維護。

開乙個陣列就能使lis更優嗎?答案是當然的,原因很簡單,我們發現,我們所維護的這個d陣列是遞增的,這一結論可以通過反證法易證。既然這一陣列是遞增的,我們就可以輕易的通過二分來得到最優解。

所以,對於每乙個元素做一遍二分,顯而易見複雜度是nlogn的。

附上一道水題 codevs 

lis問題是最經典的動態規劃基礎問題之一。如果要求乙個滿足一定條件的最長上公升子串行,你還能解決嗎?

給出乙個長度為n整數序列,請求出它的包含第k個元素的最長上公升子串行。

例如:對於長度為6的序列<2,7,3,4,8,5>,它的最長上公升子串行為<2,3,4,5>,但如果限制一定要包含第2個元素,那麼滿足此要求的最長上公升子串行就只能是<2,7,8>了。

輸入描述 input description

第一行為兩個整數n,k,如上所述。

接下來是n個整數,描述乙個序列。

輸出描述 output description

請輸出兩個整數,即包含第k個元素的最長上公升子串行長度。

樣例輸入 sample input

8 665 158 170 299 300 155 207 389

樣例輸出 sample output

資料範圍及提示 data size & hint

80%的資料,滿足0100%的資料,滿足0

1 #include2

int cnt,n,a[200100],best[200100];3

void push(intx)4

14else r=mid-1;15

}16}17

intmain()

1826}27

for(i=0;i<=k-1;i++)

28if(a[i]>=a[k])a[i]=0;29

for(i=0;i<=n-1;i++)

3034 printf("%d"

,cnt);

35return0;

36 }

關於lis的方案數

求lis的時候呢,我想n 2的做法是很簡單的,二分的話除了最長不上公升或最長不下降子串行不好求之外 畢竟要注意細節 於是從中發現了,求lis真正的序列也是十分不好求出的尤其是字典序最大的不上公升序列了,什麼的很難求的,當時好像打了hash,玄學找起點,優先佇列維護。等等,可能不是很好的思路吧。但是求...

關於加權的LIS問題

蒟蒻zigzag正在準備聯賽.這個算是這幾天做的唯一乙個值得寫一寫的題吧。首先lis的n 2暴力dp應該都會寫,就是f i max 1 那麼加權的就吧後面的1換成數的權值就行了,如果優先長度的話加一些判斷就行了。那麼o nlogn 怎麼寫?lis的nlogn應該都會寫,就是記乙個陣列d i 表示長度...

演算法的描述

注 本文為學習 c語言從入門到精通 時,對部分章節的總結 人們日常使用的語言,通俗易懂,但用來描述較為複雜的演算法時,不是很方便。流程圖是一種傳統的演算法表示法,用不同的圖框代表不同性質的操作,用流程線來知識執行方向。直觀形象,易於理解。正確性食指所寫的演算法應能安祖具體問題的要求,即對任何合法的輸...