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

1007. Maximum Subsequence Sum (25)

2017-10-27 09:16 405 查看

1. 原题链接

1007. Maximum Subsequence Sum (25)

2. 理解题目

给一个K个数字的数列,输出最大连续子序列和,首元素和尾元素;如果该数列都是负数,输出0以及整个数列的首、尾元素;

3. 解题思路

作为算法入门的例题,我们知道求最大连续子序列和的方法有4种(可以参见刘汝佳紫书–P220-224),本题经测试在O(N2)复杂度下仍可以通过;

下面就采用O(N2)和O(N)的复杂度进行展示;

具体原理参见刘汝佳紫书——P220-224

4. AC代码

//[解法 1]
//O(n)复杂度算法:从头开始加,当和小于0就置为0,重新继续求和;否则选择到目前更大的和;
//为了求出对应序列的首、尾元素,在和小于0时,暂时记住下一个元素(就是接下来的序列的首元素),
//当发现新的和更大时,就把刚才暂存的首元素变为最终所求的首元素;

#include<cstdio>
const int maxn=10010;
int n,a[maxn];
int max_sum,st,ed;//结果

int main(){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);

max_sum=a[0];st=a[0];ed=a[0];//初始化
int tmp_sum=0;int tmp_start=a[0]; //暂时的和结果,暂存的首元素
for(int i=0;i<n;i++){
tmp_sum+=a[i];
if(tmp_sum>max_sum){
max_sum=tmp_sum;
ed=a[i];
st=tmp_start;
}
if(tmp_sum<0) {tmp_sum=0;tmp_start=a[i+1];}
}
if(sum<0) printf("%d %d %d\n",0,a[0],a[n-1]);
else printf("%d %d %d\n",max_sum,st,ed);
}

//[解法 2]
#include<cstdio>
const int maxn=10010;
int n,a[maxn];
int max_sum,st,ed;
int sum[maxn];

int main(){
scanf("%d",&n);
sum[0]=0;
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i]; //保存从首元素求和的结果
}

max_sum=sum[1];st=a[1];ed=a[1];
for(int i=0;i<n;i++){         //累加起始下标i+1
for(int j=i+1;j<=n;j++){  //累加到下标为j
if(sum[j]-sum[i]>max_sum){ //如果不保存求和结果sum[],则此处重新求和,复杂度变成O($N^3$)
st=a[i+1];ed=a[j];
max_sum=sum[j]-sum[i];
}
}
}
if(max_sum<0) pr
4000
intf("%d %d %d\n",0,a[1],a
);
else printf("%d %d %d\n",max_sum,st,ed);
}

//[解法 2]的错误做法
#include<cstdio>
const int maxn=10010;
int n,a[maxn];
int max_sum,st,ed;
int sum[maxn];

int main(){
scanf("%d",&n);
scanf("%d",&a[0]);sum[0]=a[0];

for(int i=1;i<n;i++) {
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}

max_sum=sum[0];
//以下做法错误的原因在于,无法计算 a[0]+a[1],所以需要设置前置的sum[0]=0,数据从下标1开始存放
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(sum[j]-sum[i]>max_sum){
st=a[i+1];ed=a[j];
max_sum=sum[j]-sum[i];
}
}
}
if(max_sum<0) printf("%d %d %d\n",0,a[0],a[n-1]);
else printf("%d %d %d\n",max_sum,st,ed);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法入门