思路
从第一个点开始往右延,到了第i个点的时候,假设前面的和sum为正数,那么以i点结尾的最大段是不是就是sum+a[i],如果是负数那么就是a[i]
状态转移方程为dp[i]=max(dp[i-1]+a[i],a[i]),而且这里dp[i]只对dp[i+1]有用,没后后效性,所以直接省去一维,dp变量即可,a数组同理
#include<iostream>
#include<cstdio>
#define N 1001
#include<cstring>
using namespace std;
int dp;
int a;
int main()
{
int t;scanf("%d",&t);for(int j=1;j<=t;j++){
dp=0;
int n;scanf("%d",&n);
int l=1,r=1;//表示当前取的是哪一段
int ans,ansl=1,ansr=1;
scanf("%d",&a);dp=a;
ans=dp;
for(int i=2;i<=n;i++){
scanf("%d",&a);
if(dp>=0){
r++;
}
else{
r=i;l=i;
}
dp=max(dp+a,a);
if(dp>ans){
ansl=l,ansr=r;ans=dp;
}
}
printf("Case %d:\n",j);
printf("%d %d %d\n",ans,ansl,ansr);
if(j!=t)printf("\n");
}
return 0;
}