首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

算法——求数组中最大子数组跟

2012-11-22 
算法——求数组中最大子数组和题目有一输入数组,数组里面的数字都是整数,可能为正,可能为负,也可能是0,要求

算法——求数组中最大子数组和
题目
有一输入数组,数组里面的数字都是整数,可能为正,可能为负,也可能是0,要求该输入数组中最大子数组的和。
题目分析

面对这样的一个问题,首先需要仔细分析问题的条件与问题所求。这个问题提供了一个输入数组,里面会有若干个元素,每个元素可以为正数,可以为负数,也可以为0。而题目要求输出该数组中最大子数组的和,注意是要求连续相邻的若干元素组成的子数组,并且保证该子数组的和最大。

这个问题具体最优子结构,无后效性等动态规划的特点,因此可以用动态规划来解决。

设原输入数组为data[],利用另一个数组dp[i]来表示以data[i]结尾的子数组的最大和:


dp[i]=max(sum(data[start....end]))   0<=start<=end<=i 


因此最大的子数组就是dp数组中的最大值。

在实际的代码实现中可以简化dp数组,用一个变量替代他,并且实时的更新最大和,以及子数组的起始位置和结束位置。


代码部分

下面是实现该题目的部分代码:

#define LENGTH 10int max_subset(int *data,int len,int *s,int *l){int max=0;int i,j;int sum=0;int start,end;for(i=0;i<len;i++){if(sum<=0){sum=data[i];start=end=i;}else{sum=sum+data[i];end=i;}if(sum>max){max=sum;*s=start;*l=end;}}if(max==0){max=data[0];*s=*l=0;for(i=1;i<len;i++){if(data[i]>max){max=data[i];*s=*l=i;}}}return max;}int main(){int data[LENGTH]={-1,-2,3,10,-4,7,-2,5,-9,-1};int result=0;int s,l;result=max_subset(data,LENGTH,&s,&l);printf(" max sub set is %d  from %d to %d \n",result,s,l);return 0;}

小结

这是一道经典的题目,被很多公司笔试面试所采用,值得仔细研究。


热点排行