最長上公升子串行的求法,除了最樸素的動態規劃外,還有利用貪心和二分法進行求解,其時間複雜度為o(nlogn),低於動態規劃的時間複雜度o(n2),在藍橋杯這種測試樣例巨大的競賽中,使用貪心+二分法可以有效避免超時
對於乙個數列a = ,我們定義乙個陣列s和陣列b,陣列b用來儲存可能的上公升序列。s[i]表示長度為i的最長上公升子串行的結尾元素,當然這個值越小越好,因為對於乙個上公升序列,結尾的值越小,越容易往後面新增值,這就是求解的乙個貪心思想。
例如我們遍歷陣列a
a[1] = 1,b = ,s[1] =
a[2] = 3,b = ,s[2] =
a[3] = 2,由於s[2]>2,所以要將b中最後乙個替換掉,則b = ,s[2] =
a[4] = 5,b = ,s[3] =
a[5] = 9,b = ,s[4] =
a[6] =4,由於s[4]>4,所以要將b中第乙個大於4的元素替換成4,怎麼找到這個元素呢?當然是用二分法,畢竟此時b中元素已經排序好了,所以有b = ,s[4] =
a[7] = 10,b = ,s[5] =
最終我們得到最長上公升子串行的長度為5,儘管此時的b並不是正確的最長上公升子串行,但是長度是我們要找的結果。
#include
#include
#define inf 0x3f3f3f3f
using
namespace std;
int a[7]
=;int b[10]
,s[10];
intmain()
cout
}
二分求最長上公升子串行
我們知道n2 求最長上公升子串行的方法,即 f i m ax f i f j 1 j 1i 1,f i f j 然而,我們可以用二分求最長上公升子串行。由於我們知道子串行c,c 1 c 2 c n 所以我們二分出乙個位置t,將c t 的值更新為a i 如果t ans,證明最長上公升子串行的長度可以 ...
二分求最長上公升子串行
二分求最長上公升子串行 求長度 之前在書上其實見到過,但是沒想去看,結果 回到正題,二分求最長上公升子串行的思路是,在原動態規劃寫法上進行優化,優化了查詢過程,使得查詢過程變成了lon2n,然後還用到了貪心,怎麼貪,就是保證原序列長度不變的情況下,讓裡面的元素盡可能小 當然滿足遞增 下面來驗證為什麼...
LIS 最長上公升子串行 (二分優化)
題目 長度為n的序列a1,a2,an,選出滿足 j i 時,a j a i 最長子序列 分析 當選擇第i個時候,在j狀態 dp i 表示以i為終點的最大上公升序列 轉移方程 dp i max include include include include include include includ...