子序列的和 | |||||
| |||||
Description | |||||
输入一个长度为n的整数序列(A1,A2,……,An),从中找出一段连续的长度不超过m的子序列,使得这个子序列的和最大。 | |||||
Input | |||||
有多组测试数据,不超过20组测试数据
。
对于每组测试的第一行,包含两个整数n和m(n,m<=10^5),表示有n个数,子序列长度限制为m,表示这个序列的长度,第二行为n个数,每个数的范围为[-1000, 1000]。
| |||||
Output | |||||
对于每组测试数据,输出最大的子序列和,并换行。 | |||||
Sample Input | |||||
3 1
1 2 3
3 2
-1000 1000 1
| |||||
Sample Output | |||||
3
1001
![]() ![]() 1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 const int N=100010; 5 struct node 6 { 7 int v,add; 8 }que[N],tmp; 9 int main() 10 { 11 int p,a[N],n,m,begin,end; 12 while(scanf("%d%d",&n,&m)!=EOF) 13 { 14 a[0]=0; 15 for(int i=1;i<=n;i++) 16 { 17 scanf("%d",&p); 18 a[i]=a[i-1]+p; 19 } 20 begin=0; 21 end=-1; 22 int _min=-100000000; 23 for(int i=1;i<=n;i++) 24 { 25 while(begin<=end&&a[i-1]<que[end].v) 26 { 27 end--; 28 } 29 while(begin<=end&&que[begin].add<i-m) 30 { 31 begin++; 32 } 33 tmp.add=i-1; 34 tmp.v=a[i-1]; 35 que[++end]=tmp; 36 37 if(a[i]-que[begin].v>_min) 38 _min=a[i]-que[begin].v; 39 } 40 printf("%d\n",_min); 41 } 42 }
|
转载于:https://www.cnblogs.com/-sunshine/archive/2012/08/18/2645210.html