最長上公升子串行(LIS

2022-02-12 21:03:10 字數 1861 閱讀 1124

最長遞增子串行,longest increasing subsequence 下面我們簡記為 lis。

排序+lcs演算法 以及 dp演算法就忽略了,這兩個太容易理解了。

假設存在乙個序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出來它的lis長度為5。n

下面一步一步試著找出它。

我們定義乙個序列b,然後令 i = 1 to 9 逐個考察這個序列。

此外,我們用乙個變數len來記錄現在最長算到多少了

首先,把d[1]有序地放到b裡,令b[1] = 2,就是說當只有1乙個數字2的時候,長度為1的lis的最小末尾是2。這時len=1

然後,把d[2]有序地放到b裡,令b[1] = 1,就是說長度為1的lis的最小末尾是1,d[1]=2已經沒用了,很容易理解吧。這時len=1

接著,d[3] = 5,d[3]>b[1],所以令b[1+1]=b[2]=d[3]=5,就是說長度為2的lis的最小末尾是5,很容易理解吧。這時候b[1..2] = 1, 5,len=2

再來,d[4] = 3,它正好加在1,5之間,放在1的位置顯然不合適,因為1小於3,長度為1的lis最小末尾應該是1,這樣很容易推知,長度為2的lis最小末尾是3,於是可以把5淘汰掉,這時候b[1..2] = 1, 3,len = 2

繼續,d[5] = 6,它在3後面,因為b[2] = 3, 而6在3後面,於是很容易可以推知b[3] = 6, 這時b[1..3] = 1, 3, 6,還是很容易理解吧? len = 3 了噢。

第6個, d[6] = 4,你看它在3和6之間,於是我們就可以把6替換掉,得到b[3] = 4。b[1..3] = 1, 3, 4, len繼續等於3

第7個, d[7] = 8,它很大,比4大,嗯。於是b[4] = 8。len變成4了

第8個, d[8] = 9,得到b[5] = 9,嗯。len繼續增大,到5了。

最後乙個, d[9] = 7,它在b[3] = 4和b[4] = 8之間,所以我們知道,最新的b[4] =7,b[1..5] = 1, 3, 4, 7, 9,len = 5。

於是我們知道了lis的長度為5。

!!!!! 注意。這個1,3,4,7,9不是lis,它只是儲存的對應長度lis的最小末尾。有了這個末尾,我們就可以乙個乙個地插入資料。雖然最後乙個d[9] = 7更新進去對於這組資料沒有什麼意義,但是如果後面再出現兩個數字 8 和 9,那麼就可以把8更新到d[5], 9更新到d[6],得出lis的長度為6。

然後應該發現一件事情了:在b中插入資料是有序的,而且是進行替換而不需要挪動——也就是說,我們可以使用二分查詢,將每乙個數字的插入時間優化到o(logn)~~~~~於是演算法的時間複雜度就降低到了o(nlogn)~!

下面給出核心**

1 #include2 #include

3 #include4 #include5 #include6 #include7 #include8 #include9

#define inf 0x3f3f3f3f

10#define pi acos(-1.0)

11using

namespace

std;

12int str[1234

];13

int ans[1244

];14

int dp[1234][1234

];15

int len=0;16

intmain()

1727 ans[len]=str[1

];28

for(i=2;i<=m;i++)

2934

else

3541

}42 cout<1

<

44return0;

45 }

view code

最長上公升子串行 LIS

題目 兩道題幾乎一樣,只不過對於輸入輸出的要求有所不同罷了。lis有兩種方法 一 第一種方法 時間複雜度為o n 2 狀態 dp i 區間為0 i的序列的lis 轉移方程 dp i max 1,dp k 1 0 k include include include include using name...

最長上公升子串行LIS

問題 給定n個整數a1,a2,a3,a4,a5,an,從左到右的順序盡量選出多個整數,組成乙個上公升子串行,相鄰元素不相等。例如 1,6,2,3,7,5,它的最長上公升子串行為 1,2,3,5。分析 剛開始想這個問題的時候我想用遞迴來解決問題,可是後來考慮到遞迴的時間複雜度高,就覺得不能使用,並且本...

LIS 最長上公升子串行

最長遞增子串行問題 在一列數中尋找一些數,這些數滿足 任意兩個數a i 和a j 若i 設dp i 表示以i為結尾的最長遞增子串行的長度,則狀態轉移方程為 dp i max,1 j 這樣簡單的複雜度為o n 2 其實還有更好的方法。考慮兩個數a x 和a y x 按dp t k來分類,只需保留dp ...