最長上公升序列問題簡單總結

2021-10-14 08:47:58 字數 1160 閱讀 8931

先排序,然後用動態規劃思路解決問題,轉移方程:dp[i]=max(dp[i],dp[j]+1) ,if condition

例題1--300. 最長上公升子串行,給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

基本思路:對於子串行最值問題,子串行尾部元素是否被選中是乙個很重要的隱含狀態,它可以幫忙遞推下乙個的狀態,動態規劃,dp[i]表示以i為終點的最長上公升長度。

int lengthoflis(vector& nums) 

}maxlen=max(maxlen,dp[i]);

}return intervals.size()-maxlen;

}

例題2--646. 最長數對鏈,給出 n 個數對。 在每乙個數對中,第乙個數字總是比第二個數字小。現在,我們定義一種跟隨關係,當且僅當 b < c 時,數對(c, d) 才可以跟在 (a, b) 後面。我們用這種形式來構造乙個數對鏈。給定乙個數對集合,找出能夠形成的最長數對鏈的長度。你不需要用到所有的數對,你可以以任何順序選擇其中的一些數對來構造。

基本思路:同上

int findlongestchain(vector>& pairs) 

maxlen=max(maxlen,dp[i]);}}

return maxlen;

}

例題--452. 用最少數量的箭引爆氣球,一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足  xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。

基本思路:本題等價於求不連續區間的最長長度,是乙個典型的最長上公升序列問題。

int findminarrowshots(vector>& points) 

}maxlen=max(maxlen,dp[i]);

}return maxlen;

}

最長上公升子串行(總結)

求解最長子序列問題 longest increasing subsequence 縮寫為 lis 有三種方法,分別是o n 2 的dp,o nlogn 的二分 貪心法,以及o nlogn 的樹狀陣列優化的dp,這裡暫時先介紹前兩種方法 我們都知道,動態規劃的乙個特點就是當前解可以由上乙個階段的解推出...

最長上公升序列

給定乙個未經排序的整數陣列,找到最長且連續的的遞增序列。示例 1 輸入 1,3,5,4,7 輸出 3解釋 最長連續遞增序列是 1,3,5 長度為3。儘管 1,3,5,7 也是公升序的子串行,但它不是連續的,因為5和7在原陣列裡被4隔開。示例 2 輸入 2,2,2,2,2 輸出 1解釋 最長連續遞增序...

最長上公升子串行問題

網上一大堆,說說思路吧,以4 2 6 3 1 5為例 逐個讀入數字,4 此時可能的佇列長度為1,最大值為4 4 2 由於2 4,此時佇列長度為1,最大值為2 4 2 6 6 2,佇列有2個,乙個長度為1,最大為2,乙個長度為2,最大為6 4 2 6 3 3 6,3 2,佇列有2個,乙個長度為1,最大...