和最大子序列

和最大子序列

      问题描述:第一行输入一个正整数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;
}

 

点赞