-
题目描述:
-
给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。
对于S的所有非空连续子序列T,求最大的序列和。
变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。
-
输入:
-
第一行为一个正整数N,第二行为N个整数,表示序列中的数。
-
输出:
-
输入可能包括多组数据,对于每一组输入数据,
仅输出一个数,表示最大序列和。
-
样例输入:
-
5 1 5 -3 2 4 6 1 -2 3 4 -10 6 4 -3 -1 -2 -5
-
样例输出:
-
9 7 -1
这道题是动态规划的经典例子。 记MaxSequenceSum[i]表示第i个元素结尾的最大子序列和我们可以推出以下结论:当MaxSequenceSum[i-1] < 0 时,MaxSequenceSum[i] = a[i];当MaxSequenceSum[i-1] > 0时,MaxSequenceSum[i] = MaxSequenceSum[i-1] + a[i];
#include <iostream> #include <cstring> using namespace std; long long a[1000010]; long long MaxSequenceSum[1000010]; int main(){ int n; while(cin>>n){ for(int i=0;i<n;i++){ cin>>a[i]; } MaxSequenceSum[0] = a[0]; for(int i=1;i<n;i++){ if(MaxSequenceSum[i-1] < 0) MaxSequenceSum[i] = a[i]; else MaxSequenceSum[i] = MaxSequenceSum[i-1] + a[i]; } long long max = MaxSequenceSum[0]; for(int i=1;i<n;i++){ if(MaxSequenceSum[i] > max) max = MaxSequenceSum[i]; } cout<<max<<endl; } return 0; }
#include <iostream> using namespace std; int main(){ int n; long long input = 0; long long max = 0,temp = 0; while(cin>>n){ cin>>max; temp = max; for(int i=1;i<n;i++){ cin>>input; if(temp > 0){ temp = temp + input; } else temp = input; if(temp > max) max = temp; } cout<<max<<endl; } return 0; }
下面是编译是时空的对比: