最大子序列和问题
来源:互联网 发布:算法精解 java 编辑:程序博客网 时间:2024/06/08 15:10
描述:给定整数a1,a2,。。。an。(可能为负数),求 的最大值。(如所有整数均为负数,则最大子序列和为0)
算法一,
int sum(const int a[],int N){ int sum,max,i,j; for(i=0;i<N;i++){ sum=0; for(j=i;j<N;j++){ sum +=a[j]; if(sum>max) max = sum; } } return max ;}
算法二:分治
#include <stdio.h>//求三个数的最大值int max(int a,int b,int c){ if(a<b) a = b; if(a<c) a = c; return a;}static int sum(const int a[],int left,int right){ int maxleftsum,maxrightsum; int maxleftbordersum,maxrightbordersum; int leftbordersum,rightbordersum; int center,i; if(left==right) //判断是否就一个数 if(a[left]>0) return a[left]; else return 0; //(如所有整数均为负数,则最大子序列和为0) center = (left+right)/2; maxleftsum = sum( a,left,center); maxrightsum = sum(a,center+1,right); maxleftbordersum =0; //计算前半部分 leftbordersum =0; for(i=center;i>=left;i--){ leftbordersum += a[i]; if(leftbordersum>maxleftbordersum) maxleftbordersum = leftbordersum; } maxrightbordersum = 0; //后半部分 rightbordersum =0; for(i=center+1;i<=right;i++){ rightbordersum += a[i]; if(rightbordersum>maxrightbordersum) maxrightbordersum = rightbordersum; } return max(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);}int re(const int a[],int N){ return sum(a,0,N-1);}int main(){ int a[]={4,-3,5,-2,-1,2,6,-2}; int result; result = re(a,8); printf("%d\n",result); return 0 ;}
结果输出为11。
0 0
- 最大和子序列问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题~~
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- NFC技术的基础应用
- iOS x-www-form-urlencoded格式传参
- 初识类
- 12、String类
- gedit中文乱码问题
- 最大子序列和问题
- 近200篇机器学习&深度学习资料分享
- Android 如何从系统图库中选择图片
- hadoop常用算法简单实例
- Spring mvc常用注解
- 一位工程师的FPGA项目开发经验总结
- xml dtd 详解(三)
- POJ 1740 A New Stone Game
- c++平台国际化前期工作技巧