今天又回顾了一下最大子序列和,没有参考以前的资料,自己想还是想了挺久的,还好后来还是想出来了,就是将几个子序列和大于0的序列做个比较,找出和最大那个嘛。期间交的时候还WRONG了几次。实际上是一个小细节搞错了,当以前一个数作为结尾的子序列和如果小于0,那么新的子序列从当前元素开始,而我设置成了0。还有就是不一定和比0大时,才跟最大子序列和做比较,这点卡的比较蛋疼,一般很难想到。
#include<bits/stdc++.h>
using namespace std;
int a[100008];
int main(){
int t;
scanf("%d",&t);
int tmp = t;
int flag = 1;
while(t--){
int n;
int dp = 0;
int sum = 0;
int start = 1;
int end = 1;
int real_start = 1;
scanf("%d",&n);
for(int i = 0;i<n;i++){
scanf("%d",&a[i]);
}
dp = sum = a[0];
for(int i = 1;i<n;i++){
if(sum<0){
sum = 0;
start = i+1;
}
sum += a[i];
if(sum>dp){
real_start = start;
end = i+1;
dp = sum;
}
}
if(!flag){
printf("\n");
}
flag = 0;
printf("Case %d:\n",tmp-t);
printf("%d %d %d\n",dp,real_start,end);
}
}