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;
}