最長上公升子串行 Lis演算法 例題

2021-10-06 08:00:38 字數 1946 閱讀 2781

先留一篇很好的文章,

下面只是為了加深印象所記錄的乙個例題,以及一些自己的總結傳送門

這裡再加一種方法,就是再開乙個陣列,將原理的陣列複製進去後,按公升序進行排序,求這兩個串的lcs

o(n^2)樸實雙迴圈的模板

#include

#include

#include

#define maxn 1000+5

#define inf int_max

using

namespace std;

int dp[maxn]

,a[maxn]

;int

main()

for(

int i =

1; i <= n; i++)}

} maxx = dp[1]

;for

(int i =

1; i <= n; i++

) cout<}return0;

}

o(n*logn)二分加貪心模板

int dp[maxn]

,a[maxn]

;int

lis(

int n)

else

}return l;

}main函式

for(int i =

1; i <= t; i++

)int maxx =

lis(t)

;

關於o(n ^ 2)於o(n*logn)的演算法,盡量多去使用貪心二分查詢的方法,但是要注意,這種方法,其中用來維護的dp陣列內的序列不一定是正確的答案,只是裡面元素的數量是正確答案,所以如果要是求有關具體值時,則必須用o(n ^2)的演算法。

學到了兩個二分查詢的函式,不用自己寫輪子了(狗頭)函式傳送門

至於線段樹的優化,等學習了資料結構之後再進行學習吧(捂臉)

題目鏈結hdu1087 almost sorted array

這類題就是要求關於lis具體值,需要用雙重迴圈

#include

#include

#include

#define maxn 1000+5

#define inf int_max

using

namespace std;

int dp[maxn]

,a[maxn]

;int

main()

dp[1]

= a[1]

;for

(int i =

1; i <= n; i++)}

dp[i]

=max

(a[i]

,dp[i]);

//防止在前i個數中沒有遞增序列,這樣就取當前的a[i]值

} maxx = dp[1]

;for

(int i =

1; i <= n; i++

) cout<}return0;

}

二分加貪心優化的lis例題

bridging signals

#include

#include

#include

#define maxn 40000+5

#define inf int_max

using

namespace std;

int dp[maxn]

,a[maxn]

;int

lis(

int n)

else

}return l;

}int

main()

int maxx =

lis(t)

; cout<}return0;

}

最長上公升子串行 LIS 演算法

開乙個棧,每次取棧頂元素top和讀到的元素temp做比較,如果temp top 則將temp入棧 如果temp top則二分查詢棧中的比temp大的第1個數,並用temp替換它。最長序列長度即為棧的大小top。這也是很好理解的,對於x和y,如果x y且stack y stack x 用stack x...

最長上公升子串行 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。分析 剛開始想這個問題的時候我想用遞迴來解決問題,可是後來考慮到遞迴的時間複雜度高,就覺得不能使用,並且本...