没什么好说的,经典的dp问题,需要考虑一种全为负数的特殊情况,我就被这个坑死了。。。。。。。。。。。
#include<iostream>
#define N 100005
int ar[N];
int dp[N];
int start[N];
int t,n;
int st,ed;
int DP()
{
dp[0]=0;
dp[1]=ar[1];
start[0]=0;
start[1]=ar[1];
st=ed=1;
int sttmp=1,edtmp=1;
for(int i=2;i!=n+1;i++){
if(ar[i]>ar[i]+start[i-1]){
start[i]=ar[i];
sttmp=i;
edtmp=i;
}else{
start[i]=ar[i]+start[i-1];
edtmp=i;
}
if(start[i]>dp[i-1]){
dp[i]=start[i];
st=sttmp;
ed=edtmp;
}else{
dp[i]=dp[i-1];
}
}
return dp[n];
}
int main()
{
while(std::cin>>t){
for(int i=0;i!=t;i++){
std::cin>>n;
for(int i=0;i!=n;i++){
std::cin>>ar[i+1];
}
int res=DP();
std::cout<<"Case "<<i+1<<":"<<std::endl;
std::cout<<res<<" "<<st<<" "<<ed<<std::endl;
if(i!=t-1){
std::cout<<std::endl;
}
memset(ar,0,sizeof(ar));
memset(dp,0,sizeof(dp));
memset(start,0,sizeof(start));
}
}
}