题意及思路
题意:求一组序列中子序列的最大和(并输出其子序列的始末位置,下标从1开始)。
思路:暴力枚举(也不完全算),记录当前子序列的和,记录起始位置与末尾位置。下次遇到和大于ans的,更新ans。如果加到某个数时,发现前面的子序列被消灭了(即和为负数了),则下一次寻找的子序列的起始位置将从当前这个数的下一位开始。如此往复,关键点是已经记录下了上一次最大和的信息,如果未找到新的满足的最大和信息,则不更新,反之更新。
踩坑点:就是输出问题,如果有多组案例,每两个案例之间就多出一行空行,只有一组就不需要。
代码
#include <iostream> #include <cstdio> using namespace std; const int MAXSIZE = 100005; int arr[MAXSIZE]; int main() { std::ios::sync_with_stdio(false); cin.tie(0); int n,lgt,t = 1; cin >> n; while(n--){ if(t>1) printf("\n"); int tmp_sum = 0, ans = -100000, start = 1, end = 1, f = 1; cin >> lgt; for(int i=1;i<=lgt;i++){ cin >> arr[i]; tmp_sum += arr[i]; if(tmp_sum>ans){ ans = tmp_sum; start = f; end = i; } if(tmp_sum<0){ tmp_sum = 0; f = i+1; } } printf("Case %d:\n",t++); printf("%d %d %d\n",ans,start,end); } return 0; }