pat 1007. Maximum Subsequence Sum (25)

来源:互联网 发布:2016淘宝客如何推广 编辑:程序博客网 时间:2024/06/05 11:55

最大子串和,要求了始末点,稍微麻烦些。。

好头疼,交了6次才AC。。这要是去去年的openday test就罚时滚粗了。。


//@auther zhou//@Number 201408070203//@start time://@finish time:/*@此处注意:*//* 测试数据*/#include<iostream>#include<cstring>#include<vector>#include<cmath>#include<algorithm>#define ll long longusing namespace std;int main(){int k;ll a[10005],dp[10005],dp2[10005];cin>>k;for(int i=0;i<k;i++) cin>>a[i];memset(dp,0,sizeof(dp));dp[0]=a[0];for(int i=1;i<k;i++){//if(a[i]>0){//当前数>0,那么如果之前的大于0,就加上,如果之前小于0,就只取它 //if(dp[i-1]>0){//dp[i]=dp[i-1]+a[i];//}//else{//dp[i]=a[i];//}//}//else{//当前数<=0,那么如果之前>0,就加上,如果之前<0,就只取它 //if(dp[i-1]>0){//dp[i]=dp[i-1]+a[i];//}//else{//dp[i]=a[i];//}//}dp[i]=max(dp[i-1]+a[i] , a[i]);}memcpy(dp2,dp,10005);//dp2存储的是原始的 //dp是排序后的sort(dp,dp+k);ll maxans=dp[k-1];//最大的dpint begin,end;for(int i=0;i<k;i++){if(dp2[i]==maxans){end=i;break;}}//记录最小的起点,所以要取到负数结束 int i=end;for(i=end;i>=0;i--){if(dp2[i]<0){begin=i;break;}///cout<<"i:"<<i<<endl;}//cout<<"begin"<<begin<<endl;if(i==-1) begin=-1;if(maxans<0){cout<<"0 "<<a[0]<<" "<<a[k-1];}else{cout<<maxans<<" "<<a[begin+1]<<" "<<a[end];}return 0;}


原创粉丝点击