參考大佬(8條訊息) c++題解:最大子序和——單調佇列求滑動視窗最值_極客少年-csdn部落格
演算法思想(字首和+單調佇列求滑動視窗最值)
1.最優化問題
最優化問題一般可以描述為在乙個 有限集合 中求 最值 ,或者是方案數。
那麼實際可以從集合的角度,分析最優化問題。
2.對於本題來說,可以將長度為n的整數序列中所有長度不超過m的連續子串行看作乙個全集,要求的是在這個全集中找到乙個連續子串行和最大的序列。
在求解之前需要將集合分類,可以根據序列中最後乙個數在整數序列中的位置將集合劃分成若干個子集。
以a[k]
結尾的子串行為例求該類的最大值:
所有長度為j(1 ≤ j ≤ m 1\le j\le m1≤j≤m)的連續子串行的和,都可以表示為s[k] - s[k - j]。其中s[k]是固定的,那麼求最大值,只需要求k之前大小為m的區間中乙個最小的s[i]即可。
這樣本題可以轉換為長度為m的滑動視窗求最小字首和問題,可以使用單調上公升佇列優化。
這是洛谷滑動視窗模板題p1886 滑動視窗 /【模板】單調佇列 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
下面為**
#include#include#include
using
namespace
std;
intn,k;
const
int n=1000003
;struct
node
p[n];
int ans[n][2
];deque
q1,q2;//
最大,最小
intmain()
for(int i=k;i<=n;i++) printf("
%d ",ans[i][1
]); printf("\n
");for(int i=k;i<=n;i++) printf("
%d ",ans[i][0
]);
return0;
}
最大連續子串行之和,最大連續子串行乘積
最大連續子串行之和問題描述為 陣列中里有正數也有負數,連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和,求所有子陣列的和的最大值。分析,對陣列a進行一遍掃瞄,sum i 為前i個元素中,包含第i個元素且和最大的連續子陣列,maxsum儲存當前子陣列中最大和,對於a i 1 來說,sum i ...
最大連續子串行之和
窮舉法思路 1,3,4,5最大子串行為4 5 9,4 2 3 5 最大子串行為4 2 3 5 10 窮舉數列的每個區間,將區間內的數相加,更新最大值,每計算乙個區間後求和的sum要清0 include main sum 0 進入下次計算sum清0 printf d max 非列舉思路 當輸入的數全為...
最大連續子串行之和
問題描述 leyni得到了乙個長度為n的序列,xiange要求leyni最多可以修改其中k個元素,每次修改的規則是只能將乙個數字修改為其相反數。leyni想知道在修改後,他能得到的所有長度為len的連續子串行中,最大的 子串行和的絕對值 為多少?input 輸入包含多組測試資料。對於每組測試資料 第...