题目大意:给你一组(序列),求出这足序列的最大值(即最大字串);例如:(6,-1,5,4,-7),最大和为(6+(-1)+5+4)=14;
输入:给出测试次数T,以下T行,第一个数为输入的数字的个数n,接下来是n个数i;保证(-1000<=i<=1000);
输出:Case #:(#为输出顺序(从1开始));接下来一行是:最大值(max) 最大序列的起始下标(i) 最大序列的结束下标(j);
杭电1003——原题地址
输入:
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
输出:
Case 1: 14 1 4 Case 2: 7 1 6
注释分析及源代码:
#include<iostream>
using namespace std;
int main()
{
int k,t,i,n,num=1,a[10000],str[10000],start[10000];//输入数组序列——记录最大和——记录下标值,num——记录输出顺序
cin>>t;
while(t--){
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
str[1]=a[1];start[1]=1;
for(i=2;i<=n;i++){
if(str[i-1]>=0){
str[i]=str[i-1]+a[i];//如果str[i-1]大于0,
start[i]=start[i-1];//则认为对后续序列有用,并更新下标值
}
else {
str[i]=a[i];//重新开始新序列
start[i]=i;//重新记录开始下标值
}
}
int max=str[1];int end=1;
for(k=2;k<=n;k++){//查询最大值
if(str[k]>max){
max=str[k];//记录最大值
end=k;//记录开始下标(start[end])和结束下标(end),
}
}
cout<<"Case "<<num++<<":"<<endl;//满足输出格式num为全局变量
cout<<max<<" "<<start[end]<<" "<<end;
if(t!=0) cout<<endl;
}
return 0;
}