当前位置:编程学习 > C/C++ >>

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

题目

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

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

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

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

 

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

 

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

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

 

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


[cpp] 
#define LENGTH 10 
 
int 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; 

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

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,