程序员面试金典——解题总结: 9.17中等难题 17.8给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和

这篇博客介绍了一种使用动态规划方法解决找出整数数组中总和最大的连续数列的问题。通过前缀和的方式,定义dp[i]表示以A[i]结尾的最大连续子序列之和,并给出详细代码实现。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;

/*
问题:给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和
分析:这个是动态规划问题,采用前缀和的方式来解决。
      设dp[i]表示以元素A[i]结尾的最大连续子序列之和
	  最大连续子序列和的产生方式不过两种:
	  1】是通过以A[i-1]结尾的最大连续子序列之和 + A[i]形成的
	  2】前面A[i-1]结尾的最大连续子序列之和小于0,直接抛弃,重新选择A[i]作为最大连续子序列之和
	  所以有dp[i] = max{dp[i-1] + A[i] , A[i]}
	  dp[0] = A[0]
	  而且需要记录最大连续子序列之和的起始位置,设数组paths,
	  paths[i]表示以dp[i]结尾的最大连续子序列和的起始位置
输入:
9(数组元素个数n,下一行输入n个元素)
3 -4 5 7 -1 2 6 1 -13
输出:
20(最大连续子序列和)
5 7 -1 2 6 1(最大连续子序列)
*/

int maxSubsequenceSum(vector<int>& datas ,vector<int>& dp, vector<int>& paths , int& maxEndIndex)
{
	if(datas.empty())
	{
		throw("No data");
	}
	int size = datas.size();
	int max = INT_MIN;
	int maxIndex = -1;
	for(int i = 0 ; i < size ; i++)
	{
		if(i)
		{
			if( dp[i-1] <=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值