求最大连续子段和 的 dp算法
2013-05-01 17:32
393 查看
问题描述:
有n个数(以下都视为整数,浮点的也一样),每个数有正有负,现在要在n个数中选取相邻的一段,使其和最大,输出最大的和。
问题分析:
对于这样的问题,我们可以直接用暴力,一个双重循环,虽说可以,但也没有更高明的方法? 我们再分析这个问题,如果我们知道了某个数前面一段数的和,我们就该考虑把这个数加入到前一段,还是重新开始一段。这个地方很重要,如果前一段的和小于0,我们重新建一段,反之加到前一段。这样我们就可以把n个数分成几段了,且每一段都求出了他们的和,然后再循环一次求出最大的一个和,我们就得到想要的结果了,也可以在分段的时候直接求结果。
代码
有n个数(以下都视为整数,浮点的也一样),每个数有正有负,现在要在n个数中选取相邻的一段,使其和最大,输出最大的和。
问题分析:
对于这样的问题,我们可以直接用暴力,一个双重循环,虽说可以,但也没有更高明的方法? 我们再分析这个问题,如果我们知道了某个数前面一段数的和,我们就该考虑把这个数加入到前一段,还是重新开始一段。这个地方很重要,如果前一段的和小于0,我们重新建一段,反之加到前一段。这样我们就可以把n个数分成几段了,且每一段都求出了他们的和,然后再循环一次求出最大的一个和,我们就得到想要的结果了,也可以在分段的时候直接求结果。
代码
int MaxSub (int a[]) { int dp , max, i; max = dp[0] = a[0]; for (i=1; i<N; i++) { if (dp[i-1] > 0) dp[i] = dp[i-1] + a[i]; else dp[i] = a[i]; if (dp[i] > max) max = dp[i]; } return max; }
相关文章推荐
- 求最大连续子段和 的 dp算法
- 求最大连续子段和 的 dp算法
- 数组的连续最大子段和
- NOJ 2045 罗马PK (线性dp 最大连续子段和)
- POJ 2593 Max Sequence POJ 2479 Maximum sum (线性dp 最大连续两不重叠子段和)
- gym101138J(树链剖分,线段树维护区间连续子段最大和,好题)
- 最大子段-n个数求和最大且连续的子段-最简单的一维dp,动态规划入门教程,包听懂
- poj 2479 最大连续子段和 dp算法
- poj 2479 dp Maximum sum求两段连续不重叠子段的最大和
- hdu2845 DP最大不连续子段和
- HDU2845_Beans【不连续的最大子段和】【元素压缩】
- 严格递增最大连续子段(思维)
- 最大连续子段和、M子段和
- A - Max Sum Plus Plus HDU1024 ( 动态规划 多段连续子段和的最大值)
- HDU 1422重温世界杯 (环形)最长连续子段 由最大连续子段和变形的到
- 数组的连续最大子段和
- 数组的连续最大子段和
- 分治之连续子段最大和
- o(n)算法求大连续字段和,并返回最大子段和中的元素
- 数组的连续最大子段和