数组最大子序列和

// 数组的最大子序列和:
// 连续的子数组,和为最大。
//设sum[i] 为前i个元素中,包含第i个元素且和最大的连续子数组,
//result 为已找到的子数组中和最大的。
//对第i+1个元素有两种选择:做为新子数组的第一个元素、放入前面找到的子数组。
//sum[i+1] = max(a[i+1], sum[i] + a[i+1])
//result = max(result, sum[i])

#include <iostream>   
using namespace std;
#include <iterator>
int maxsum(int ap[], int n, int &a, int &b)      
{  
	int max=ap[0];        
	int sum=ap[0]; 
	int p1=0, p2=0;
	for(int j=1;j<n;j++)  
	{  
		if(sum<0)      
		{
			sum=ap[j];  
			p1=p2=j;
		}
		else     
		{
			sum+=ap[j];    
			p2=j;
		}
		if(sum>max)  
		{
			max=sum;  
			a=p1;
			b=p2;
		}
	}  
	return max;  
}  

int main()  
{  
	int ap[]={-1, -2, 3, 10, -4, 7, 2, -5};  
	int ap2[]={-91, -2, -3, -10, -4, -7, -2, -5};  

	int a,b;
	copy(ap,ap+8,ostream_iterator<int>(cout," "));
	cout<<endl<<"maxsum:"<<maxsum(ap, 8,a,b)<<endl;  
	copy(ap+a,ap+b+1,ostream_iterator<int>(cout," "));
	cout<<endl<<endl;

	copy(ap2,ap2+8,ostream_iterator<int>(cout," "));
	cout<<endl<<"maxsum:"<<maxsum(ap2, 8,a,b)<<endl;  
	copy(ap2+a,ap2+b+1,ostream_iterator<int>(cout," "));
	cout<<endl<<endl;

	return 0;  
}


 

 

思路:记录sum的值,sum依次统计序列元素的和,如果sum<0,则丢弃之前的sum值,采用新的值sum=p[i]。

DP递推时,需要比较sum与最大值max,取其较大者。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值