题意及思路
题意:求一组序列中子序列的最大和(并输出其子序列的始末位置,下标从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;
}

京公网安备 11010502036488号