演算法知識總結 最長遞增子串行

2021-08-11 13:50:38 字數 2662 閱讀 1578

最長遞增子串行:找到給定序列的最長子序列的長度,使得子串行所有元素單調遞增。

最長公共子串行求法的時間複雜度: θ(

nlgn

)+θ(

n2)=

θ(n2

) θ(n

lgn)

+θ(n

2)=θ

(n2)

與第乙個辦法不同的是,動態規劃是直接在原問題上採用動態規劃

最優子結構:

對於長度為n的陣列a[

n]= a[n

]=,假設我們想要以aiai

結尾的最大遞增子串行長度,設長度l[i]l

[i],那麼 l[i

]=a

=,則:

具體打表方式如下:

//lis 的動態規劃方式實現  

include using namespace std;

int getlislength(int a, int

len)

本解法的具體操作如下:

遍歷結束之後,最長遞增序列長度即為棧的大小。注意c陣列的下標代表的是子串行的長度,c陣列中的值也是按遞增順序排列的。這才可能用二分查詢。

int getlislength(int num, int length)   

ivec[low] = num[i];

} }

return ivec.size();

特別注意的是:本方法只能用於求最長遞增子串行的長度輔助陣列中的序列不是最長遞增子串行:

問題描述:

計算最少出列多少位同學,使得剩下的同學排成合唱隊形

問題說明:

n n

位同學站成一排,**老師要請其中的(n

−k)' role="presentation">(n−

k)(n

−k)位同學出列,使得剩下的k位同學排成合唱隊形。

合唱隊形是指這樣的一種隊形:設

k k

位同學從左到右依次編號為1,

2…,k

,' role="presentation">1,2

…,k,

1,2…

,k,他們的身高分別為t1

,t2,

…,tk

, t1,

t2,…

,tk,

則他們的身高滿足存在i(

1<=

i<=k)i(

1<=

i<=k)

使得t1

<..>

....

−1>ti

+1>..

....

>tkt1

<..>

....

−1>ti

+1>..

....

>tk

。 任務是:

已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。

輸入: 整數n

n,一行整數,空格隔開,

n' role="presentation">n

n位同學身高

輸出:

最少需要幾位同學出列

樣例輸入:

8
186 186 150 200 160 130 197 200樣例輸出:

4
根據題意可知,我們需要求出乙個「中間點」,使得其左邊的【最長遞增子串行】和其右邊的【最長遞減子串行】之和最大。

```

#include

#include

using

namespace

std;

int longgestincreaselength(vector

&vec)

}

for (int i = vec.size() - 2; i >= 0; --i)

}

int max = 0;

for (int i = 0; i < vec.size(); i++)

return vec.size() - max + 1;

}

int main()

最長遞增子串行

這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...

最長遞增子串行

最長遞增子串行又叫做最長上公升子串行 子串行,正如lcs一樣,元素不一定要求連續。本節討論實現三種常見方法,主要是練手。題 求乙個一維陣列arr i 中的最長遞增子串行的長度,如在序列1,1,2,3,4,5,6,7中,最長遞增子串行長度為4,可以是1,2,4,6,也可以是 1,2,4,6。方法一 d...

最長遞增子串行

最長遞增子串行 求乙個字串的最長遞增子串行 如 dabdbf最長遞增子串行就是abdf,長度為4 這是一道基本的動態規劃求解的題目,與此類似的還有 最長公共子串行 分析 用一維陣列dp i 來儲存以a i 為末元素的最長遞增子串行的長度,那麼dp i 至少為1 即包含它本身 往前尋找,如果存在a j...