http://acm.hdu.edu.cn/showproblem.php?pid=1003
最大连续子序列和,dp[i] = max(dp[i-1]+a[i],a[i]),注意维护st
/*
hdu 1003 最大连续子序列和 dp
题意:
给你n个数,找到最大的连续子序列,使得和最大,且能输出它的起始、终止位置
思路:
dp[i] = max(dp[i-1]+a[i],a[i]),dp[i]表示以i结尾的子序列的最大和
期间维护一个maxx、st、end即可,st的维护要注意当st改变的时候要记录
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
#include<sstream>
#define eps 1e-9
#define pi acos(-1)
#define INF 0x7fffffff
#define inf -INF
#define MM 12900
#define N 110
using namespace std;
typedef long long ll;
const int _max = 1e5 + 10;
int a[_max],dp[_max];//dp[i]以第i个元素结尾的最大连续子序列和
int st,ent;
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
int T;cin>>T;int kase = 1;
while(T--){
int n;scanf("%d",&n);
for(int i = 0; i < n; ++ i) scanf("%d",a+i);
if(kase>1)printf("\n");//控制输出
memset(dp,0,sizeof(dp));
dp[0]=a[0];
st= ent = 0;
int maxx = a[0];int t = 0;
for(int i = 1;i < n; ++ i){//状态转移
if(dp[i-1]+a[i]<a[i]){
dp[i]=a[i];
t = i;//开始位置需要记录
}
else dp[i] = dp[i-1]+a[i];
if(maxx<dp[i]) {
maxx = dp[i];
st = t;
ent = i;
}
}
printf("Case %d:\n",kase++);
printf("%d %d %d\n",maxx,st+1,ent+1);
}
return 0;
}