輸入乙個長度為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...