題意:
給定乙個長度為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...