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