dp题,更不如说是决策题,WA、PE了N次,总算纠结出来了。。。
题目讨论如下:
对存放数据的数组从左至右遍历,有下列四种情况:
1.sum,ai>=0: 直接加入子列队伍,sum+=ai,end=i;
2.sum<0,ai>=0: 记下start=end=i,sum=ai;
3.sum<0,ai<0: 取sum和ai中最大者,若ai>sum,同2处理;
4.sum>0,ai<0:同1处理;
每次遍历完,比较maxsum与sum大小,记录较大者。
最后输入结果,code:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#define MIN -100000
using namespace std;
int a[100001];
struct{
int stt,end;
int s;
}msum,sum;
int main(){
int i,t,n,counter=0;
cin>>t;
while(t--){
cin>>n;
for(i=0;i<n;i++) cin>>a[i];
sum.s=msum.s=MIN;
sum.stt=sum.end=0;
for(i=0;i<n;i++){
if(a[i]>=0&&sum.s>=0){
sum.s+=a[i];
sum.end=i;
}
else if(a[i]>=0&&sum.s<0){
sum.stt=sum.end=i;
sum.s=a[i];
}
else if(a[i]<0&&sum.s<0){
if(sum.s<a[i]){
sum.s=a[i];
sum.stt=sum.end=i;
}
}
else{
sum.s+=a[i];
sum.end=i;
}
if(sum.s>msum.s){
msum.s=sum.s;
msum.stt=sum.stt;
msum.end=sum.end;
}
}
cout<<"Case "<<++counter<<":"<<endl;
cout<<msum.s<<" "<<msum.stt+1<<" "<<msum.end+1<<endl;
if(t) cout<<endl;
}
return 0;
}