思路分析:
1.记录每个点之前的的和,找出最大值。并记录end,然后由end出发向前找到和最大值相同的strat.
2.dp[i]=maxnum(dp[i],dp[i-1]+a[i])
代码:
#include<iostream>
using namespace std;
int maxnum(int a,int b)
{
if(a>b)return a;
else return b;
}
int main()
{
int t,a=0;
cin>>t;
for(a=0;a<t;a++)
{
int i,n;cin>>n;
int nm[n],dp[n],st,ed,sum=0,MAX;
for(i=0;i<n;i++)
{
cin>>nm[i];
dp[i]=nm[i];
} st=ed=1;
for(i=1;i<n;i++)
{
dp[i]=maxnum(dp[i],dp[i-1]+nm[i]);
}
MAX=dp[0];
for(i=0;i<n;i++)
{
if(dp[i]>MAX){MAX=dp[i];ed=i+1;}
}
sum=0;
for(i=ed-1;i>=0;i--)
{
sum+=nm[i];
if(sum==MAX){st=i+1;}
}
cout<<"Case "<<a+1<<":"<<endl;
cout<<MAX<<" "<<st<<" "<<ed<<endl;
if(a<t-1)cout<<endl;
}
}