先留一篇很好的文章,
下面只是為了加深印象所記錄的乙個例題,以及一些自己的總結傳送門
這裡再加一種方法,就是再開乙個陣列,將原理的陣列複製進去後,按公升序進行排序,求這兩個串的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。分析 剛開始想這個問題的時候我想用遞迴來解決問題,可是後來考慮到遞迴的時間複雜度高,就覺得不能使用,並且本...