求数组的子数组之和的最大值

问题:一个有N个整数元素的一维数组(A[0],A[1],...,A[n-2],A[n-1]),这个数组有很多子数组(连续的几个数),那么子数组之和的最大值是什么呢?

据说微软曾用这道题难倒很多学生,本文从《编程之美》中记录了一种速度比较快的解法。

分析:可以考虑数组的第一个元素A[0],假设已经知道(A[1],...,A[n-1])中和最大的一段数组之和为All[1],并且已经知道(A[1],...,A[n-1])中包含A[1]的和最大的一段数组为Start[1],那么,(A[0],...,A[n-1])中问题的解All[0]是就是max{A[0],A[0]+Start[1],All[1]}。通过这样的分析,可以看出这个问题符合无后效性,可以使用动态规划的方法来解决。

完整代码如下(dev-c++环境下编译运行):

#define max(x, y) (x > y ? x :y)

int MaxSum(int *A, int n)
{
     // 参数检查
     int i = 0;
     int nStart = A[n-1];
     int nAll = A[n-1];
     for (i = n-2; i >= 0; i--)
     {
         nStart = max(A[i], nStart + A[i]);
         nAll = max(nStart, nAll);
    }
    return nAll;
}

int main()
{
     int A[] = {0, -2, 3, 5, -1, 2};
     printf("最大子数组和为:%d\n",MaxSum(A,6)); 
     system("pause"); 
     return 0;
} 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,903评论 0 33
  • 最大连续子序列问题 问题定义: 给定K个整数的序列{ N1, N2, ..., Nk },其任意连续子序列可表示为...
    HITMiner阅读 16,790评论 3 8
  • 1 月老其实并不老,当他在天上的时候,还是临风玉树的模样。也就是每次下凡的时候,非得变成一个全身都白,除了眼珠子还...
    大钱小胖阅读 2,622评论 27 21
  • 明山寨位于大别山腹地岳西县青天乡西北部,与霍山县接壤,范围甚广,是整个大别山脉的一部分。历史记载,明山寨建于元末明...
    茶人老七阅读 1,207评论 1 1
  • 我的2015用一个字来总结:变 2015 —25周岁,是值得纪念的一年!25周岁,开启了毕业后工作的第二段旅程,毕...
    原草家阅读 164评论 0 0

友情链接更多精彩内容