和最大子序列

和最大子序列

      问题描述:第一行输入一个正整数n(1 < n < 100001),第二行输入n个整数A(0 < A < 10000 ),求该组整数子序列最大的和。

     解决这个问题应该考虑输入n较大的情况,也就是说,输入100000个数字判断它的和最大子序列应当也能很快地算出来。我看过很多求解的代码,有三重for循环的,有两重for循环的,也有使用递归,但这些方法大多要么超时,要么栈溢出,当然一开始我做的时候也出现过类似的情况,但最终我用一层循环实现。

      那么,怎么使用一层循环实现呢?首先定义一个变量long long int large来表示最大的和,变量long long int lastResu表示上一个加法的结果,然后从数组A的0下标开始,与后面的元素做加法运算,与些同时,large得到每一次加法前的最大的和,接着判断加法运算的结果,若小于0,则将上一个下标赋值给lastResu,继续做循环

long long large = -100000;
void fun(int* arr, int n)
{
	long long int last = *arr;
	for(int i = 1; i < n; i++)
	{
		large = large > last ? large : last;
		large = large > arr[i] ? large : arr[i];
		large = large > arr[i] + last ? large : arr[i] + last;

		if(last + arr[i] < 0)
			last = arr[i];
		else
			last += arr[i];

	}
}

int main()
{
	int n;
	int i = 0;
	cin >> n;

	int* arr = new int[n];
	for(i = 0; i < n; i++)
		cin >> *(arr + i);

	fun(arr, n);
	cout << large;

	system("pause");
	return 0;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值