传送门
实际上就是最长公共子序列问题,不过问题有两个小坑需要注意下。
特殊情况1:整个序列都是负数
特殊情况2:最大公共子序列和不止有一个,这个时候也很简单,倒着来就行。看我代码就会明白
实际上就是最长公共子序列问题,不过问题有两个小坑需要注意下。
特殊情况1:整个序列都是负数
特殊情况2:最大公共子序列和不止有一个,这个时候也很简单,倒着来就行。看我代码就会明白
#include <iostream>
using namespace std;
class MSS{
public:
MSS(){
K=0;ptr=NULL;
begin_num=0,end_num=0;
max_sum=0;
}
void getData(){
// freopen("num.txt","r",stdin);
cin>>K;
ptr=new int[K];
for(int i=0;i<K;i++)
cin>>ptr[i];
}
bool is_special(){
for(int i=0;i<K;i++)
if(ptr[i]>=0)
return false;
return true;
}
void slove(){
bool flag=is_special();
if(flag){
cout<<0<<" "<<ptr[0]<<" "<<ptr[K-1]<<endl;
return;
}
int cur_num=0;
for(int i=0;i<K;i++){
cur_num+=ptr[i];
if(cur_num>max_sum){
max_sum=cur_num;
end_num=ptr[i];
int temp=cur_num;
for(int j=i;j>=0;j--){
temp-=ptr[j];
if(temp==0){
begin_num=ptr[j];
break;
}
}
}
if(cur_num<0)
cur_num=0;
}
print();
}
void print(){
cout<<max_sum<<" "<<begin_num<<" "<<end_num<<endl;
}
private:
int begin_num,end_num;
int max_sum;
int K;
int *ptr;
};
int main(int argc,char **argv){
MSS M;
M.getData();
M.slove();
return 0;
}