acm題集:
最大子序和
題目:基本資料結構」例題/1201 最大子序和
題意:輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。
單調列隊,表示下標上公升,對應的字首和也遞增的列隊。
列隊中儲存的是字首和的下標。
由於求的是連續不超過m的最大自序和。所以列隊的左端(隊頭),儲存的下標不能小於i-m,i表示當前遍歷的字首和的下標。
對於本問題,找到乙個左端點 j,其中j屬於[i-m,i-1]並且s[j]最小。
不妨比較一下任意兩個位置j,k,如果k=s[j],那麼對於所有大於等於i的右端點,k永遠不會成為最優選擇。因為s[k]不小於s[j],而且j離得比i遠,長度更不容易超過m,即j的生存能力比k更強。所以當這樣乙個j出現了的時候,k就完全是乙個無用的位置了。
#include
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using
namespace std;
int q[
300005
],sum[
300005
],a[
300005];
int n,m;
void
solve()
cout<}int
main()
solve()
;return0;
}
最大子序和 單調佇列
輸入乙個長度為n的整數序列,從中找出一段長度不超過m的連續子串行,使得子串行中所有數的和最大。輸入格式 第一行輸入兩個整數n,m。第二行輸入n個數,代表長度為n的整數序列。同一行數之間用空格隔開。輸出格式 輸出乙個整數,代表該序列的最大子序和。資料範圍 1 n,m 300000 輸入樣例 6 4 1...
JOI(TYVJ)最大子序和 DP 單調佇列
輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。例如 1,3,5,1,2,3 當m 4時,s 5 1 2 3 7 當m 2或m 3時,s 5 1 6 計算區間和的問題一般用字首和表示。先用s i 表示序列中前i項的和,然後s i s j 1 就可以表示i j的和 ...
單調佇列簡單應用 最大子序和
description 輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。例如 1,3,5,1,2,3 當m 4時,s 5 1 2 3 7 當m 2或m 3時,s 5 1 6。input 第一行兩個數n,m n,m 300000 第二行有n個數,要求在n個數找到最大...