單調遞減佇列

2021-07-23 03:03:43 字數 840 閱讀 5147

題意:

給定乙個長度為n的序列,有乙個長度為k的滑動視窗,視窗從左向右依次移動,求每次移動時視窗中的最大值。

演算法實現:

1.有一種很常見的演算法,時間複雜度為o(n*k)的演算法,線性遍歷每個數再求每個滑動視窗中的最大值,、但當k很大的時候非常耗時。

2.還有一中就是單調遞減佇列,可以把時間複雜度優化到接近o(n),既然是單調佇列,那我們就要定義乙個佇列,而且還要是雙端的。下面我們模擬一下。

假定這個序列的k為3,那我們從第乙個元素開始訪問,這個時候我們有乙個空的雙端佇列que。我們先把第乙個元素及下標入隊,隊列為,然後開始訪問第二個元素,把第二個元素的值與第乙個元素的值比較,如果小於則往佇列後面加,否則將他前面的乙個元素刪除,直至遇到比它大的為止,然後將它加入佇列。這個佇列中就變成了。繼續操作,佇列變成、、,而這時,我們可以看到佇列中的元素個數大於了k,而這時我們應該判斷隊首元素下標是否小於i-k+1,如果小於則刪除隊首元素。依照此操作重複進行,直到整個序列遍歷完成。在我們入隊的時候其實可以只入隊下標,用下標來查詢元素。

**如下:

#include#include#includeusing namespace std;

int n,k;

int cnt = 0;

int a[100002];

int id[100002];

int ans[100002];

dequeque;

void getmax()

}int main()

求最長單調遞減子串行

來自 問題描述 求乙個陣列的最長遞減子串行 比如的最長遞減子串行為。思路 這是很經典的乙個問題,用動態規劃解決。假設源陣列為a,定義乙個輔助陣列為b,b i 表示以a i 結尾的最長遞減序列的長度。舉個簡單的例子,如果a i 大於之前的所有元素,那麼b i 1。有了這個輔助陣列 後,可以推出下面這個...

HDU 3410(遞減單調棧)

現在有n個人站成一行,告訴你每個人的身高。現在每個人都要找到在他左邊,比他矮的人中最高的人的位置。同時也要找到,在他右邊比他矮的人中最高的人的位置。注意由於他們是站成一行的,所以他們不能越過比他們高的人去看後面的人。也就是說,他只能看到他本人和他的左邊 或右邊 第乙個比他高的人之間的那些人。請輸出每...

dp求最長單調遞減序列

一道線性dp,和前天寫的是一樣的,今天準備在學一學二分寫法 ac include h using namespace std 最大單調遞減序列 define maxn 1005 int dp maxn int a maxn int n void slove dp int maxx 1 for int...