最長不降子串行問題

2021-05-24 12:24:04 字數 1941 閱讀 3745

一、問題

輸入

設有由n個不相同的整數組成的數列,記為:a(1)、a(2)、……、a(n)且a(i)<>a(j) (i<>j)

若存在i1長度為e的不下降序列。

輸出

程式要求,當原數列給出之後,求出最長的不下降序列。

例子

數列3,18,7,14,10,12,23,41,16,24。

3,18,23,24就是乙個長度為4的不下降序列,同時也有3,7,10,12,16,24長度為6的不下降序列。

二、解法一:動態規劃之o(n2)的解法

1、狀態轉移方程

設a[i]表示序列中的第i個數,

f[i]表示從1到i這一段中以i結尾的最長上公升子串行的長度,

初始時設f[i] = 0(i = 1, 2, ..., len(a))

則有動態規劃方程:f[i] = max (j = 1, 2, ..., i - 1, 且a[j] < a[i])

2、**

三、解法二:動態規劃之o(n logn)的解法

更多:http://www.cppblog.com/superkiki/archive/2010/08/09/122868.aspx

1、狀態轉移方程

現在,我們仔細考慮計算f[i]時的情況。假設有兩個元素a[x]和a[y],滿足

(1)x < y < i (2)a[x] < a[y] < a[i] (3)f[x] = f[y]

此時,選擇f[x]和選擇f[y]都可以得到同樣的f[i]值,那麼,在最長上公升子串行的這個位置中,應該選擇a[x]還是應該選擇a[y]呢?

很明顯,選擇a[x]比選擇a[y]要好。因為由於條件(2),在a[x+1] ... a[i-1]這一段中,如果存在a[z],a[x] < a[z] < a[y],則與選擇a[y]相比,將會得到更長的上公升子串行。

再根據條件(3),我們會得到乙個啟示:根據f的值進行分類。對於f的每乙個取值k,我們只需要保留滿足f[i] = k的所有a[i]中的最小值。設d[k]記錄這個值,即d[k] = min (f[i] = k)。

注意到d的兩個特點:

(1) d[k]的值是在整個計算過程中是單調不上公升的。

(2) d的值是有序的,即d[1] < d[2] < d[3] < ... < d[n]。

利用d,我們可以得到另外一種計算最長上公升子串行長度的方法。設當前已經求出的最長上公升子串行長度為len。先判斷a[i]與d[len]。若a[i] > d[len],則將a[i]接在d[len]後將得到乙個更長的上公升子串行,len = len + 1, d[len] = a[i];否則,在d[1]..d[len]中,找到最大的j,滿足d[j] < a[i]。令k = j + 1,則有d[j] < a[i] <= d[k],將a[i]接在d[j]後將得到乙個更長的上公升子串行,同時更新d[k] = a[i]。最後,len即為所要求的最長上公升子串行的長度。

在上述演算法中,若使用樸素的順序查詢在d[1]..d[len]查詢,由於共有o(n)個元素需要計算,每次計算時的複雜度是o(n),則整個演算法的時間複雜度為o(n^2),與原來的演算法相比沒有任何進步。但是由於d的特點(2),我們在d中查詢時,可以使用二分查詢高效地完成,則整個演算法的時間複雜度下降為o(nlogn),有了非常顯著的提高。需要注意的是,d在演算法結束後記錄的並不是乙個符合題意的最長上公升子串行!

這個演算法還可以擴充套件到整個最長子序列系列問題,整個演算法的難點在於二分查詢的設計,需要非常小心注意。

2、**

最長不降子串行

原文 這題目是經典的dp題目,也可叫作lis longest increasing subsequence 最長上公升子串行或者 最長不下降子串行。很基礎的題目,有兩種演算法,複雜度分別為o n logn 和o n 2 一 問題描述 設有由n個不相同的整數組成的數列,記為 a 1 a 2 a n 且...

最長不降子串行 dp

問題描述 給定乙個字串,求出其不降子串行的最大長度。分析 從後往前逆推 06對於n個數,我們可以分為n 1個階段。07我們由後向前搜尋 逆推法 我們可以這樣思考 081 對a n 來說,由於它是最後乙個數,所以當從a n 開始查詢時,只存在長度為1的不下降序列 092 若從a n 1 開始查詢,則存...

最長不降子串行(二)

受到 一 中啟發,現補充位元組跳動19年第二次筆試第四題程式。題目如下 4.一天,小凱同學震驚的發現,自己屋內的pm2.5指標是有規律的!小凱取樣了pm2.5的數值,發現pm2.5數值以小時為週期迴圈,即任意時刻的pm2.5總是和一小時前相等!他的室友小文同學提出了這樣乙個問題,在t小時內的所有取樣...