您的位置:首页 > 产品设计 > UI/UE

pat 1007. Maximum Subsequence Sum (25)

2017-07-04 10:36 323 查看
最大子串和,要求了始末点,稍微麻烦些。。

好头疼,交了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 long
using 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];//最大的dp

int 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: