数据结构(学习002天)给n个数求和

数据结构第二版 陈越

#include<stdio.h>
int main()//复杂度n^3
{
	int N=6,j=0;
	int MaxSubseqSum1(int A[], int N);
//	scanf("%d", &N);
	int A[10]={-2,11,-4,13,-5,-2};
	j=MaxSubseqSum1(A, N);
	printf("%d", j);
	return 0;
}
int MaxSubseqSum1(int A[], int N)
{
	int MaxSum=0,ThisSum=0,i,j,k;
	for (i=0;i<N;i++)
	{
		for (j=i;j<N;j++)/* i是子列左端位置 */
		{
			ThisSum=0; /* ThisSum是从A[i]到A[j]的子列和 */
			for (k=i;k<=j;k++) 
				ThisSum+= A[k];
			if (ThisSum>MaxSum)//int A[10]={-2,11,-4,13,-5,-2}
				MaxSum=ThisSum;
		}
	}
	return MaxSum;
}

数据结构

#include<stdio.h>
int main()//复杂度n^2
{
	int N=6,j=0;
	int A[6]={-2,11,-4,13,-5,-2};
	int MaxSubseqSum1(int A[], int N);
	j=MaxSubseqSum1(A,N);
	printf("%d",j);
	return 0;
 } 
int MaxSubseqSum1(int A[], int N)
{
	int MaxSum=0,ThisSum=0,i,j,k;
	for(i=0;i<N;i++)/* i是子列左端位置 */
	{
		ThisSum=0; /* ThisSum是从A[i]到A[j]的子列和 */
		for(j=i;j<N;j++)/* j是子列右端位置 */
		{	
			ThisSum+=A[j]; /*对于相同的i,不同的j,只要在j-1次循环的基础上累加1项即可*/ 
			if(MaxSum<ThisSum)/* 如果刚得到的这个子列和更大 */
				MaxSum=ThisSum;  /* 则更新结果 */
		} /* j循环结束 */    
	} /* i循环结束 */    
	return MaxSum;
}

shujujiegou

int Max3( int A,int B,int C)
{/*返回3个整数中的最大值*/
	return A>B?A>C?A:C:B>C?B:C;
}
int DivideAndConquer( int List[],int left,int right)
{ /*分治法求List[left]到List[right]的最大子列和*/
	int MaxLeftSum,MaxRightSum; /*存放左右子问题的解*/
	int MaxLeftBorderSum,MaxRightBorderSum; /*存放跨分界线的结果*/
	int LeftBorderSum,RightBorderSum;
	int center,i;
		if(left==right){ /*递归的终止条件,子列只有1个数字*/
			if(List[left]>0)
			 return List[left];
		else return 0;
		}
		/*下面是"分"的过程*/
	center=(left+right)/2; /*找到中分点*/
	/*递归求得两边子列的最大和*/
	MaxLeftSum=DivideAndConquer(List,left,center);
	MaxRightSum=DivideAndConquer(List,center+1,right);
	/*下面求跨分界的最大子列和*/
	MaxLeftBorderSum=0; LeftBorderSum= 0;
	for(i=center; i>=left; i--){ /*从中线向左扫描*/
	LeftBorderSum+=List[i];
	if(LeftBorderSum>MaxLeftBorderSum)
	MaxLeftBorderSum= LeftBorderSum;
	}/*左边扫描结束*/
	MaxRightBorderSum=0;RightBorderSum=0; 
	for(i=center+1; i<=right;i++){ /*从中线向右扫描*/
	RightBorderSum+=List[i];
	if( RightBorderSum >MaxRightBorderSum)
	MaxRightBorderSum = RightBorderSum;
	} /*右边扫描结束*/
/*下面返回"治"的结果*/
return Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum+MaxRightBorderSum);
}
int MaxSubseqSum3(int List[],int N)
{ /*保持与前2种算法相同的函数接口*/
return DivideAndConquer(List,0, N-1);
}

在这里插入图片描述

#include<stdio.h>
int main()
{
	int N,j=0;
	int MaxSubseqSum1(int A[], int N);
	scanf("%d",&N);
	int A[N];
    for(int i=0;i<N;i++)
        scanf("%d",&A[i]);
	j=MaxSubseqSum1(A,N);
	printf("%d",j);
	return 0;
}
int MaxSubseqSum1(int A[], int N)
{
	int MaxSum=0,ThisSum=0,i;
	for(i=0;i<N;i++)
	{
		ThisSum+=A[i];
		if(ThisSum>MaxSum)
			MaxSum=ThisSum;
		else if(ThisSum<0)
			ThisSum=0;
	}    
	return MaxSum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琦琦今天加油了吗?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值