最大子序列和问题

#include<stdio.h>
#include<stdlib.h>
//求最大子序列和问题 



//解法四 无法获取位置
void getMax5(int a[],int len){
	int max=0,result=0;
	for(int i=0;i<len;i++){
		result+=a[i];
		if(max<result){
			max=result;
		}else if(result<0){
			result=0;
		}
	}
	printf("最大子序列和为:%d",max);
} 

//解法三 分治 
int getMax4(int a[],int left,int right){
	printf("left:%d,right:%d\n",left,right);
	if(left==right){
		if(a[left]>0){
			return a[left];
		}else{
			return 0;
		}
	
	}
	int center=(left+right)/2;
	int leftNum=getMax4(a,left,center);
	int rightNum=getMax4(a,center+1,right);
	
	//开始求解
	int result=0;
	int lmax=0,rmax=0; 
	for(int i=center;i>=left;i--){
		result+=a[i-1];
		if(lmax<result){
			lmax=result;
		}
	} 
	result=0;
	for(int j=center+1;j<=right;j++){
		result+=a[j-1];
		if(rmax<result){
			rmax=result;
		}
	}
	
	
	printf("%d,%d,%d,%d,%d\n ",left,right,lmax,rmax,lmax+rmax);
	
	
} 



//解法二的不同形式
void getMax3(int a[],int len){
	int max=0;
	for(int i=0;i<len;i++){
		int result=0;
		for(int j=i;j<len;j++){
			result+=a[j];
			if(max<result){
				max=result;
			}
		}
	}
	printf("最大子序列和:%d",max);
	
	
} 


//解法二O(n^2) 
void getMax2(int a[],int len){
 	int result[len][len];
 	for(int i=0;i<len;i++){
 		for(int j=0;j<len;j++){
 			result[i][j]=0;
 		}
 	}
	 for(int i=0;i<len;i++){
 		for(int j=0;j<len;j++){
 			if(i==0){
 				result[i][j]=a[j];
 			}else if(i>0&&(i+j)<len){
 				result[i][j]=result[i-1][j]+a[j+i];
 			}
			 
 		}
 	} 
 	
 	for(int i=0;i<len;i++){
 		for(int j=0;j<len;j++){
 			printf("%d ",result[i][j]);
 		}
 		printf("\n");
 	}
 	
} 




//求出所有的子序列  O(n^3)
void getMax(int a[],int len){
	int *max;
	max=(int *)malloc(sizeof(int)*1024);
	int num=0;
	
	int i=0;
	while(i<len){
		for(int j=0;j<len;j++){
			int temp=i;
			int t=j;
			int result=0;
			while(temp-->=0&&i+j<len){
				printf("%d,%d\n",a[t],t);
				result+=a[t++];
			}
			printf("结果是%d\n",result);
			if(result!=0){
				*(max+num)=result;
				num++;	
			}
			
		}
		i++;
	}
	int m=max[0];
	for(int i=0;i<num;i++){
		printf("%d ",max[i]);
		if(m<max[i]){
			m=max[i];
		}
	}
	printf("\n最大的子序列和为:%d",m);
	free(max);
}



int main(){
	int test[]={-2,11,-4,13,-5,-2}; 
	getMax5(test,sizeof(test)/sizeof(int));
	//getMax4(test,1,sizeof(test)/sizeof(int));
	
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值