Maximum Subsequence Sum
思路
数据结构视频里面简单的讲了一下动态规划的方法,但这个题还需要输出开始最后的序列数,测试点中包含了全是负数、0和负数、最大子序列中含有负数、有不止一个最大子序列、最大子序列开头是0、最大子序列末尾是0这些情况。一开始想针对每个测试点专门写条件判断输出,感觉这种思路不是很对,后来参考了一下网上的解答,关键是要设置一个临时的开头结尾,判断。
实现
注释掉的一部分是原来错误的方法
#include<iostream>
using namespace std;
int main(){
int num;
cin>>num;
int a[num];
for(int i=0;i<num;i++) cin>>a[i];
int thissum=0,maxsum=0;
int start=0,end=num-1;
int temp_start=0,temp_end=0;
//int fin=0,lan=0;
//int length=0;
for(int j=0;j<num;j++){
if(thissum>=0){
thissum+=a[j];
temp_end=j;
}
else{
thissum=a[j];
temp_start=j;
temp_end=j;
}
if(thissum>maxsum||(thissum==0)&&(end==num-1)){
//the latter condition only happens when 0 is the start and end is the inital state
maxsum=thissum;
start=temp_start;
end=temp_end;
//length++;
//lan=j;
}
/*
else if(thissum<0){
thissum=0;
}*/
}
//cout<<length;
//fin=lan-length+1;
/*
int flag1=0;//negative?
int flag2=0;//0?
for(int k=0;k<num;k++){
if(a[k]>0) flag1++;
if(a[k]==0) flag2++;
}
if(flag1==0&&flag2==0){
maxsum=0;
fin=0;
lan=num-1;
cout<<maxsum<<' '<<a[fin]<<' '<<a[lan]<<endl;
}
else if(flag1==0&&flag2>0){
maxsum=0;
fin=0;
lan=0;
cout<<0<<' '<<0<<' '<<0<<endl;
}
else{
cout<<maxsum<<' '<<a[fin]<<' '<<a[lan]<<endl;
}*/
cout<<maxsum<<' '<<a[start]<<' '<<a[end]<<endl;
return 0;
}