题目:点击打开链接
Sample Input
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Sample Output
Case 1: 14 1 4 Case 2: 7 1 6
int main() {
freopen("in.txt","r",stdin);
int T;
cin>>T;
for(int ind=1; ind<=T; ++ind) {
int n;
cin>>n;
vector<int> ivec(n);
for(int i=0; i<n; ++i)
cin>>ivec[i];
vector<int> start(n),all(n);
start[0]=ivec[0];
all[0]=ivec[0];
for(int i=1; i<n; ++i) {
start[i]=max(start[i-1]+ivec[i],ivec[i]);
all[i]=max(all[i-1],start[i]);
}
int startIdx,endIdx;
int i;
for(i=n-1; i>=0; --i) {
if(start[i]==all[n-1]) {
endIdx=i;
break;
}
}
int sum=0;
for(int j=i; j>=0; --j) {
sum+=ivec[j];
if(sum==all[n-1]) {
startIdx=j;
break;
}
}
printf("Case %d:\n",ind);
cout<<all[n-1]<<" "<<startIdx+1<<" "<<endIdx+1<<endl;
}
return 0;
}
上面是从做到右的方法,对于case2的情况输出的下标值是6,6,因为前面0 6 -1 1 -6加起来的值为0,所以题目给的结果是1,6,进行一个修正,也就是从右到左的顺序:
start[i]=max(ivec[i],start[i+1]+ivec[i])
all[i]=max(all[i+1],start[i]);
int main() {
freopen("in.txt","r",stdin);
int T;
cin>>T;
for(int ind=1; ind<=T; ++ind) {
int n;
cin>>n;
vector<int> ivec(n);
for(int i=0; i<n; ++i)
cin>>ivec[i];
vector<int> start(n),all(n);
start[n-1]=ivec[n-1];
all[n-1]=ivec[n-1];
for(int i=n-2; i>=0; --i) {
start[i]=max(start[i+1]+ivec[i],ivec[i]);
all[i]=max(all[i+1],start[i]);
}
int startIdx,endIdx;
int i,sum=0;
for(i=0; i<n; ++i) {
bool flag=false;
if(start[i]==all[0]) {
startIdx=i;
for(int j=i; j<n; ++j) {
sum+=ivec[j];
if(sum==all[0]) {
endIdx=j;
flag=true;break;
}
}
}
if(flag) break;
}
printf("Case %d:\n",ind);
cout<<all[0]<<" "<<startIdx+1<<" "<<endIdx+1<<endl;
if(ind<T) cout<<endl; }
return 0;
}