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;
}
好头疼,交了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;
}
相关文章推荐
- PAT 1007. Maximum Subsequence Sum (25)
- PAT甲题题解-1007. Maximum Subsequence Sum (25)-求最大子区间和
- PAT (Advanced Level) 1007. Maximum Subsequence Sum (25) dp
- PAT 甲级 1007. Maximum Subsequence Sum (25) 【最大子串和】
- PAT (Advanced Level) 1007. Maximum Subsequence Sum (25) vector
- 【PAT】【Advanced Level】1007. Maximum Subsequence Sum (25)
- 【PAT甲级】【C++】1007. Maximum Subsequence Sum (25)
- PAT 1007. Maximum Subsequence Sum (25)
- PAT 甲级 1007. Maximum Subsequence Sum (25)
- PAT (Advanced Level) 1007. Maximum Subsequence Sum (25) 解题报告
- PAT 1007. Maximum Subsequence Sum (25)
- PAT (Advanced) 1007. Maximum Subsequence Sum (25)
- PAT 1007. Maximum Subsequence Sum (25)
- PAT - 甲级 - 1007. Maximum Subsequence Sum (25)
- PAT_A 1007. Maximum Subsequence Sum (25)
- PAT-1007. Maximum Subsequence Sum (25)
- 【PAT Advanced Level】1007. Maximum Subsequence Sum (25)
- PAT 1007. Maximum Subsequence Sum (25)(dp动态规划)
- PAT (Advanced Level) Practise 1007. Maximum Subsequence Sum (25)
- PAT Advanced 1007. Maximum Subsequence Sum (25) (C语言实现)