一維陣列中最長遞增子串行的長度(DP做法)

2021-06-18 10:42:09 字數 768 閱讀 5935

1. 簡述

寫乙個時間複雜度盡可能低的程式,求乙個一維陣列中最長遞增子串行的長度。

例如在序列1,-1,2,-3,4,-5,6,-7中,其最長的遞增子串行的長度為4(如1,2,4,6)。

2. 思路

這個題目與前面求一維陣列中子陣列之和最大值有點像,不過區別還是很明顯,比如:子陣列是陣列中一串連續相鄰的數字,而子串行不一定是相鄰的,因此要得到[0-k]的子陣列最大和,只要分析[0-(k-1)]的子陣列最大和即可,而考慮[0-k]的子串行的最長長度,就不能只分析[0-(k-1)]中子序列的最長長度。另外乙個區別就是,子陣列的和可以擴充套件到二維陣列的情況,但是遞增子串行就不好擴充套件了,最多也就擴充套件成楊氏三角吧。

方法一:我們計算每個可能的子串行,判斷其是否為遞增的,然後選取其中最大的乙個。可能的子串行有2^n個,因此複雜度是o(2^n)。

方法二:由於我們要判斷乙個元素能否與已有的乙個子串行構成乙個更長的子串行,只有比較這個元素與這個子串行的最後乙個元素即可,那麼實際上對於[0-(i-1)]內的2^i個子序列,實際上我們只需要記錄以包含每個元素且以該元素結尾的最長子序列長度即可。即定義maxlen[i],表示a[0]-a[i]範圍內,且包含a[i]的最長子序列長度。這樣2^i個子序列用i個子序列就能夠代表了。

遞推公式為:maxlen[0]=1,maxlen[i]=max,k=0,1,2,...,i-1。

最後max,i=0,1,2,...,n-1,即為所求。

這種方法將2^n中子序列用n個子序列來代表(根據子串行構成的方法,只需要判斷子串行的最後乙個元素),複雜度為o(n^2)。

陣列中最長遞增子串行的長度

求陣列中最長遞增子串行的長度 什麼是最長遞增子串行呢?問題描述如下 設l 是n個不同的實數的序列,l的遞增子串行是這樣乙個子串行lin 其中k1 如 在序列1,1,2,3,4,5,6,7中,其最長的遞增子串行為1,2,4,6。其長度為4。對於這個問題有以下幾種解決思路 1 把a1,a2,an排序,假...

陣列中最長遞增子串行

陣列是亂序的,如1,1,2,3,4,5,6,7 根據無後效性定義,陣列中當前元素所形成的子串行與其前面元素形成的子串行沒有關係,所以 lis i 1 max 1,lis k 1 其中,array i 1 arry k 且任意k i lis i 儲存對於當前陣列arry i 形成的最長子序列的長度值,...

求序列中最長遞增子串行的長度

include define maxnum 100 函式功能 求解序列中的最大遞增子串行的中包含的元素個數 演算法說明 用到了動態規劃問題,分解子問題b陣列是用來儲存每乙個子串行中的最大遞增子串行 求具有n個元素的序列中的最大遞增自序列問題分解為 a 0 a 0 a 1 a 0 a 1 a 2 a ...