最長上公升子串行兩種複雜度的演算法 LIS

2021-07-24 22:23:36 字數 733 閱讀 2724

本文的講解摘自《挑戰程式設計競賽》

不過說實話最長上公升子串行這個概念並不難,我覺得難的是你能夠把題目中的意思和解法抽象成最長上公升子串行

廢話不多說了開始講解第一種演算法

定義dp[i] 表示以ai結尾的最長上公升子串行的長度

這時呢又分為兩種情況

第一只包含ai

第二 前面的長度 + ai

所以得到遞推式

dp[i] = max(1,dp[j] + 1);

**如下:

void solve()

res = max(res,dp[i]);    //挑選最大的上公升子串行

}cout<

這種演算法的複雜度是o(n^2)  太大了 一般不能滿足題目的解題需求

所以再給出 o(nlog(n))複雜度的演算法

下圖為他的思想步驟

當長度相同時每次都找最小的值放在最後因為這樣在以後的查詢中更有優勢

**如下  這時利用了 stl中的乙個函式

void solve()

cout<

最後可以留乙個簡單的題目:

給定你一組任意的數字  這組數字使亂序的 比如  1,32,12,34,0,21,324,21,,,,

請你找出如何刪除最少的數字讓剩下的數字有序?

提公升:應用最長上公升子串行!

最長上公升子串行的兩種寫法

乙個序列a 找出它的最長上公升子串行的個數,很明顯是4個,可以是,或者。他有兩種實現的方法 第一種是時間複雜度為o n 2 的演算法 include include include include using namespace std intmain int n sizeof a sizeof i...

最長上公升子串行的兩種解法

問題描述 乙個數的序列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 等等...

最長上公升子串行(兩種方法)

設有整數序列b1,b2,b3,bm,若存在下標i1第一行n 第二行 整數序列 10318 7141012 2341 1624最大長度n和所有長度為n的序列個數 6把每個數與前面的數組成的最長上公升子串行的長度記錄在一維陣列中。記錄的數就是前面小於它的數中最長上公升子串行的長度最長的數 1。一下內容補...