1007 Maximum Subsequence Sum (25 分)
题目大意:
求出最长子序列的和,连续序列,并且输出这个序列的开头和结尾数值
分析:
这个题我一开始读题没有读到 如果全是负数 就特殊处理这种情况
所以是按照常规的模式做的 可能对于这道题来说有点麻烦
tmp 用来存放当前最左边的下标
fir用来表示最终左边下标
ed表示最终右边下标
sum表示当前的和
MaxSum表示最终的最大子序列和
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
int n,fir,ed,sum=0,MaxSum=0,tmp;
int num[10005];
bool flag=false;
const int INF=999999999;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>num[i];
if(num[i]>=0)
flag=true;
}
fir=ed=sum=0;//初始化
MaxSum= -INF;
for(int i=0;i<n;i++){
if(sum==0)
tmp=i;
sum+=num[i];//每一个数字先加到sum中
if(sum<0){//如果sum小于零 表明再加上后面的一定比现有的还要小
//所以就从下一个开始加,把当前sum=0
if(sum>MaxSum){
fir=tmp;
MaxSum=sum;
ed=i;
}
sum=0;
}
else{
if(sum>MaxSum){
fir=tmp;
MaxSum=sum;
ed=i;
}
}
}
if(MaxSum<0)
cout<<"0 "<<num[0]<<" "<<num[n-1]<<endl;
else
cout<<MaxSum<<" "<<num[fir]<<" "<<num[ed]<<endl;
return 0;
}