演算法競賽高階指南 最大子序和 字首和 單調佇列

2021-09-19 05:24:36 字數 1006 閱讀 4076

輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。

第一行兩個數n,m(n,m<=300000) 第二行有n個數,要求在m個數內找到最大子序和

乙個數,數出他們的最大子序和

641

-351

-23

7
這道題相當於求區間和最大,那可以考慮字首和相減。單調佇列可用於求區間最值問題。

維護乙個單調遞增佇列,隊頭元素始終是最小的,隊尾元素始終是最大的。

想想,要求兩數差最大,那肯定要乙個最大,乙個最小,才能得到差最大,所以要維護乙個單調遞增佇列。使入隊元素與隊頭元素作差。

#include

#include

#include

#include

using namespace std;

int n, m;

int nums[

300000+5

];int s[

300000+5

];deque<

int> deq;

int ans =0;

intmain()

deq.

push_back(0

);// 儲存乙個初始元素0,用於比較數列的第乙個元素。

for(

int i =

1; i <= n; i++

) deq.

push_back

(i);

while

(!deq.

empty()

&& deq.

front()

< i - m)

ans =

max(ans, s[i]

- s[deq.

front()

]);}

cout << ans << endl;

return0;

}

演算法競賽高階指南 0x12 最大子序和

這其實是一道單調佇列優化區間dp問題,對於這個序列,我們可以劃分為n個區間,每個區間代表以ai結尾,長度不超過m的子串行和,我們只需要遍歷一遍每個集合,找到每乙個集合中的最大值,那麼就可以更新出這個序列的最大值 如何找每個集合中的最大值呢,最大值就是要求出以a k 結尾,長度不超過m的子串行和最大,...

《演算法競賽高階指南》0x12 T4 最大子序和

題目傳送門 輸入乙個長度為 n nn 的整數序列,從中找出一段長度不超過 m mm 的連續子串行,使得子串行中所有數的和最大。注意 子串行的長度至少是 111。第一行輸入兩個整數 n nn mmm。第二行輸入 n nn 個數,代表長度為 n nn 的整數序列。同一行數之間用空格隔開。輸出乙個整數,代...

演算法競賽高階指南 字首統計 Trie

description 給定n個字串s1,s2 sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1 sn中有多少個字串是t的字首。輸入字串的總長度不超過106,僅包含小寫字母。字串 s1 不妨假設長度為 n 被稱為字串 s2 的字首,當且僅當 s2 的長度不小於 n,且 s1 與 s2 前 n...