东莞网站设计公司哪家好,花生棒 wordpress,wordpress用户组可见,门户网站英文Acwing 135 最大子序和
题目#xff1a;
输入一个长度为 n 的整数序列#xff0c;从中找出一段长度不超过 m 的连续子序列#xff0c;使得子序列中所有数的和最大。
题解#xff1a; 我们把这个问题的集合分成n份#xff0c;第k份表示以A[k]结尾的最大连续子序列是多少…Acwing 135 最大子序和
题目
输入一个长度为 n 的整数序列从中找出一段长度不超过 m 的连续子序列使得子序列中所有数的和最大。
题解 我们把这个问题的集合分成n份第k份表示以A[k]结尾的最大连续子序列是多少 我们以A[k]结尾为例我们从A[k]开始向前延申长度jj的范围是[1,m],我们引入前缀和S[k]表示前k个数的前缀和那么图中长度为j以A[k]结尾的连续子序列答案就是S[k]-S[k-j], 现在S[k]是固定的我们要让值最大就要使得S[k-j]最小就相当于在长度为m的区间即从[k-m,k]内找最小值,这不就把问题引入到滑动窗口
代码:
#includebits/stdc.h
#define debug(a,b) printf(%s %d\n,a,b);
typedef long long ll;
using namespace std;inline int read(){int s0,w1;char chgetchar();while(ch0||ch9){if(ch-)w-1;chgetchar();}while(ch0ch9) ss*10ch-0,chgetchar();//s(s3)(s1)(ch^48);return s*w;
}
const int INF1e9;
const int maxn3e59;
int n,m;
int s[maxn],q[maxn];int main()
{scanf(%d%d,n,m);for(int i1;in;i){scanf(%d,s[i]);s[i]s[i-1];}int res-INF;int hh0,tt0;for(int i1;in;i){if(q[hh]mi)hh;//如果超过范围 resmax(res,s[i]-s[q[hh]]);while(hhtts[q[tt]]s[i])tt--;//维护一个递减序列 q[tt]i;}coutres;return 0;
}