拼题A:01-复杂度2 Maximum Subsequence Sum (25分)
#include <stdio.h>
#define MAXK 100000
void MaxSubSum(int L[], int N);
int main()
{
int a[MAXK], K;
scanf("%d", &K);
for(int i=0; i<K; i++)
scanf("%d", &a[i]);
MaxSubSum(a,K);
}
void MaxSubSum(int L[], int N)
{
int ThisSum=0, MaxSum=-1, left, right, isleft=0;/*MaxSum为负数能帮助后面判断,序列是否全是负数*/
/*isleft是临时的左边编号*/
for(int i=0; i<N; i++){
ThisSum+=L[i];
if(ThisSum>MaxSum){
MaxSum=ThisSum;
right=i;
left=isleft;
}
else if(ThisSum<0){
ThisSum=0;
isleft=i+1;/*重点!!!因为这里的i+1有可能是left。要判断是不是left,要看之后有没有ThisSum>MaxSum*/
}
}
if(MaxSum<0)
printf("0 %d %d",L[0] ,L[N-1]);
else
printf("%d %d %d",MaxSum,L[left],L[right]);
}
重点:
1、是引入临时的left,因为ThisSum<0时,left可能等于i+1,要判断是不是left,要看之后有没有ThisSum>MaxSum。
2、MaxSum为负数能帮助后面判断,序列是否全是负数,同时能解决MaxSum为0的情况。
写于2020-10-27 22:57
#include <stdio.h>
int main()
{
int K;
scanf("%d",&K);
int M[K-1];
for(int i=0;i<K;i++)
scanf("%d",&M[i]);
int i,tep=0,MaxSum=0,head=0,tail=0,tepright=0;
for(i=0;i<K;i++){
tep+=M[i];
if(tep>MaxSum){
MaxSum=tep;
tail=M[i];
head=M[tepright];
}
else if(tep<0){
tep=0;
tepright=i+1;
}
}
int a=0;
//要是MaxSum的初始值设为负数,就可以判断是否全为负数,以及找到0的位置了。
if(MaxSum==0){
while(a!=K&&M[a])
a++;
if(a==K){
tail=M[K-1];
head=M[0];
}
else{
tail=head=M[a];
}
}
printf("%d %d %d",MaxSum,head,tail);
return 0;
}
#include <stdio.h>
int main()
{
int K;
scanf("%d",&K);
int M[K-1];
for(int i=0;i<K;i++)
scanf("%d",&M[i]);
int i,j,head,tail,MaxSum=0,tep;
for(i=0;i<K;i++){
tep=0;
for(j=i;j<K;j++){
tep+=M[j];
if(MaxSum<tep){
MaxSum=tep;
head=M[i];
tail=M[j];
}
}
}
int a=0;
if(MaxSum==0){
while(a!=K&&M[a])
a++;
if(a==K){
tail=M[K-1];
head=M[0];
}
else{
tail=head=M[a];
}
}
printf("%d %d %d",MaxSum,head,tail);
return 0;
}
写于2021-3-26 20:48