Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 43843 Accepted Submission(s): 20002
6 -2 11 -4 13 -5 -2 10 -10 1 2 3 4 -5 -23 3 7 -21 6 5 -8 3 2 5 0 1 10 3 -1 -5 -2 3 -1 0 -2 0
20 11 13 10 1 4 10 3 5 10 10 10 0 -1 -2 0 0 0 Hint Hint Huge input, scanf is recommended.
连DP数组都不需要,只需要一个数sum记录当前连续子序列的和即可,如果sum<0,代表当前子序列对于此后的元素都没有意义,更新sum,然后判断与是否是最大值,如果是最大值就更新记录的区间下标即可。需要注意的题目要求:若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
#include<bits/stdc++.h> using namespace std; int anss,sum,l,r,anssl,anssr,i,n,a[10005]; int main() { while(scanf("%d",&n),n!=0) { for(i=1;i<=n;i++) { scanf("%d",&a[i]); } sum=a[1]; l=1; r=1; anssl=1; anssr=1; anss=a[1]; for(i=2;i<=n;i++) { if(sum<0) { sum=a[i]; l=i; r=i; } else { sum+=a[i]; r++; } if(sum>anss) { anss=sum; anssl=l; anssr=r; } } if(anss<0) { printf("0 %d %d\n",a[1],a[n]); } else { printf("%d %d %d\n",anss,a[anssl],a[anssr]); } } }
原文:https://www.cnblogs.com/dyhaohaoxuexi/p/11432844.html