问题描述
给定序列a [1],a [2],a [3] ...... a [n],您的工作是计算子序列的最大和。例如,给定(6,-1,5,4,-7),此序列中的最大和为6 +(-1)+ 5 + 4 = 14。
输入
输入的第一行包含一个整数T(1 <= T <= 20),这意味着测试用例的数量。然后是T行,每行以数字N开始(1 <= N <= 100000),然后是N个整数(所有整数都在-1000和1000之间)。
产量
对于每个测试用例,你应该输出两行。第一行是“Case#:”,#表示测试用例的编号。第二行包含三个整数,序列中的最大和,子序列的起始位置,子序列的结束位置。如果有多个结果,则输出第一个结果。在两种情况之间输出一个空行。
示例输入
25 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
示例输出
情况1:14 1 4
案例2:7 1 6
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; int a[100006]={0}; int main() { int t; scanf("%d",&t); for(int w=1;w<=t;w++) { int n; int maxn=-10000,xx=1,yy,e=1,temp=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); temp+=a[i]; if(temp>maxn) { xx=e;yy=i;maxn=temp; } if(temp<0) { e=i+1;temp=0; } } printf("Case %d:\n",w); printf("%d %d %d\n",maxn,xx,yy); if(w!=t) { printf("\n"); } } return 0; }