輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。
先用s um
[]
sumsu
m[]存一下序列的字首和
我們需要找到乙個最大的sum
[r]−
sum[
l](r
−l
<=m
)sum[r]-sum[l](r-l<=m)
sum[r]
−sum
[l](
r−l<=m
)拿雙端佇列維護
最優解的情況就是下標遞增,sum
[]
sumsu
m[]也遞增才可以
int a[maxn]
,sum[maxn]
;deque<
int>q;
intmain()
q.push_back(0
);int ans=
-inf;
for(
int i=
1;i<=n;i++)if
(q.size()
)while
(q.size()
&&sum[q.
back()
]>=sum[i]
) q.
push_back
(i);
} cout<}
佇列 最大子序和
1 n,m 300000 輸入樣例 6 41 3 5 1 2 3 輸出樣例 7思路 顯然我們要在字首和陣列中sum i 的前m範圍內找到乙個min,那麼以第i個數結尾的m個連續元素的序列的最大子序和就是這個sum i min 最後就只需要遍歷一遍尋找答案啦。顯然在尋找min的時候我們也可以迴圈列舉,...
最大子序和 單調佇列
輸入乙個長度為n的整數序列,從中找出一段長度不超過m的連續子串行,使得子串行中所有數的和最大。輸入格式 第一行輸入兩個整數n,m。第二行輸入n個數,代表長度為n的整數序列。同一行數之間用空格隔開。輸出格式 輸出乙個整數,代表該序列的最大子序和。資料範圍 1 n,m 300000 輸入樣例 6 4 1...
演算法競賽高階指南 最大子序和 字首和 單調佇列
輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。第一行兩個數n,m n,m 300000 第二行有n個數,要求在m個數內找到最大子序和 乙個數,數出他們的最大子序和 641 351 237這道題相當於求區間和最大,那可以考慮字首和相減。單調佇列可用於求區間最值問題...