连续子序列最大和问题(dp)

假设以第i个元素结尾的最大连续子串的和为sum[i],则以第i+1个元素结尾的最大连续子串的和,要么为sum[i]+a[i+1],要么为a[i+1],也即sum[i+1] = max{sum[i]+ a[i+1],a[i+1]},也即:当sum[i]>0时:sum[i+1] = sum[i]+ a[i+1],当sum[i]<0时,sum[i+1] = a[i+1];
这是典型的动态规划。其实很清晰很简单,但网上有些帖子讲的很绕很复杂。导致我跪了。。。
本题重点就在于:假设了以第i个元素结尾的最长子串的和为sum[i],并且理清了以第i+1个元素结尾的最长子串的和sum[i+1]与以第i个原酸结尾的最长子串的和sum[i]的关系


//求任意n个正负整数里面最大的连续和
$arr = [-10, -9, 8, -4, -2, 0, 1, -2, 3, 4, -5, 6, 9];
function max_sum_array($arr)
{
    $currSum = 0;
    $maxSum = 0;//数组元素全为负的情况,返回最大数
    $n = count($arr);
    for ($i = 0; $i < $n; $i++) { 
        if ($currSum >= 0) {
            $currSum += $arr[$i];
        } else {
            $currSum = $arr[$i];
        }
    }
    if ($currSum > $maxSum) {
        $maxSum = $currSum;
    }
    return $maxSum;
}
var_dump(max_sum_array($arr));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容