動態規劃 最大上公升子串行

2021-07-29 23:45:10 字數 1342 閱讀 8387

乙個數的序列bi,當b1 < b2 < … < bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列(a1, a2, …,an),我們可以得到一些上公升的子串行(ai1, ai2, …, aik),這裡1 <= i1 < i2 < … < ik <=n。

比如,對於序列(1, 7, 3, 5, 9, 4, 8),有它的一些上公升子串行,如(1, 7), (3, 4, 8)等等。這些子串行中最長的長度是4,比如子串行(1, 3, 5, 8).

問題描述如上,那麼如何實現求解乙個未知序列的最大上公升子串行呢?首先應該進行問題分解,依舊以(1, 7, 3, 5, 9, 4, 8)為例,maxs[i]表示以i為終點的最大上公升子串行長度,這裡從1開始。

以第一位為終點的子串行,只有1個,maxs[1] = 1;

以第二位為終點的子串行,(1,7),maxs[2] = 2;

以第三位為終點的子串行,(1,7,3),maxs[3] = 2;

…以第n位為終點的子串行,maxs[n] = t(t未知);

那麼現在問題就可以簡化為求max陣列中的最大值。即為最大上公升子串行的長度。

現在重點來了,我們如何來求得maxs呢。當我們以第n位為終點時,他的最大上公升子串行maxs[n]為在第i(1 < i < n-1)位中,所有滿足arr[i] < arr[n]的maxs[i]中的最大值加1。

現在,問題可以說已經迎刃而解,那就讓我們來通過美麗的**實現他吧。

function

maxchildlen

(arr)

}maxs[i] = flag + 1;

if (maxs[i] > max)

}return max;

}

演算法改進:

從第一位開始,第一位進入陣列b中;

第二位如果大於b[0],直接入棧b[1],否則,替換b[0];

第三位,如果大於b的最後一位,則入棧b,否則,在b中尋找大於arr[3]的最小位(下界),然後將其替換掉。

… 以此類推,第n位與b[b.length]進行比較,如果大於b[b.length];直接入棧b,否則在b中尋找大於arr[n]的下界,將其替換。

… 最後b的長度就是最大上公升子串行的長度。

這樣一來,我們可以將原來的兩層迴圈,分為乙個迴圈和乙個查詢,查詢我們採用二分查詢,從而將時間複雜度降為logn; 這樣,演算法總的時間複雜度有logn^2優化為nlogn。

貼**:

//最大上公升子串行

function maxlen(arr) else }}

return maxarr;

}

nice!

動態規劃 求最大上公升子串行

問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...

最大上公升子串行(動態規劃)

最大上公升子串行 動態規劃 s 給定陣列,輸出陣列的最大上公升子串行。輸入 兩行測試資料 第一行代表陣列元素個數 第二行輸入陣列中的整數 輸出 輸出最大上公升子串行的長度 輸入樣例 81 3 4 2 7 9 6 8 輸出樣例 5 一和 二思路一樣,都是從陣列的第i 1 i n 位置開始尋找最大上公升...

最大上公升子串行和 簡單動態規劃

乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等。這些子串...