拼题A:01-复杂度2 Maximum Subsequence Sum两种解法

拼题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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值