題意:求一組序列中子序列的最大和(並輸出其子序列的始末位置,下標從1開始)。ios
思路:暴力枚舉(也不徹底算),記錄當前子序列的和,記錄起始位置與末尾位置。下次遇到和大於ans的,更新ans。若是加到某個數時,發現前面的子序列被消滅了(即和爲負數了),則下一次尋找的子序列的起始位置將從當前這個數的下一位開始。如此往復,關鍵點是已經記錄下了上一次最大和的信息,若是未找到新的知足的最大和信息,則不更新,反之更新。spa
踩坑點:就是輸出問題,若是有多組案例,每兩個案例之間就多出一行空行,只有一組就不須要。code
#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; }