最大子序列和问题

来源:互联网 发布:veket linux下载 编辑:程序博客网 时间:2024/05/18 00:45
问题: 
给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 

例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O(n^3)。
    显然这种方法不是最优的,下面给出一个算法复杂度为O(n)的线性算法实现,算法的来源于Programming Pearls一书。在给出线性算法之前,先来看一个对穷举算法进行优化的算法,它的算法复杂度为O(n^2)。其实这个算法只是对对穷举算法稍微做了一些修改:其实子序列的和我们并不需要每次都重新计算一遍。

int max_sum(int a[],int size){int max=a[0];for (int i=0;i!=size;i++){int v=0;for (int j=i;j!=size;j++){v+=a[j];if(max<v)max=v;}}return max;}
下面是动态规划代码,其时间复杂度为O(n):
int max_sum(int a[],int size){int max=0,temp=0;for (int i=0;i!=size;i++){temp+=a[i];if(temp>max)max=temp;else if(temp<=0)            temp=0;}return max;}

可以参考::最大子序列和问题

原创粉丝点击