题意: 给定n个数, 输出最大连续区间和及区间的首尾.[s,e]
解法: dp[i]表示以第i个数结尾作为1-i的最大连续子串和,则转移方程为: dp[i] = max(dp[i-1]+dp[i], dp[i]), 求得连续区间和的最大值,再进行确定区间
#include<bits/stdc++.h>
#define rep(i,a, b) for(int i=(a); i<(b); ++i)
#define repp(i, a, b) for(int i=(a); i>=(b); --i)
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
#define ll long long
#define de(a) cout<<#a<<" => " <<(a)<<endl
const int maxn = 1e6+5;
using namespace std;
int dp[maxn];
int a[maxn];
int main(){
//freopen("in.txt", "r", stdin);
int n, cas=0;
int te;
scanf("%d", &te);
while(te--){
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
scanf("%d", &n);
rep(i, 1, n+1) scanf("%d", &a[i]);
dp[1]=a[1];
rep(i, 2, n+1) {
dp[i] = max(dp[i-1]+a[i], a[i]);
}
int e=1, MAX=dp[1];
rep(i, 2, n+1) {//寻找连续区间和最大的值
if(dp[i]>MAX) MAX=dp[i], e=i;
}
int t=0;
int s=e;
repp(i, e, 1){
t += a[i];
if(t == MAX) s=i;
}
printf("Case %d:\n", ++cas);
printf("%d %d %d\n", MAX, s, e);
if(te) printf("\n");
}
return 0;
}