描述:
给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。 对于S的所有非空连续子序列T,求最大的序列和。 变量条件:N为正整数,N≤1000000,结果序列和在范围(-263,263-1)以内。
输入描述:
第一行为一个正整数N,第二行为N个整数,表示序列中的数。
输出描述:
输入可能包括多组数据,对于每一组输入数据, 仅输出一个数,表示最大序列和。
输入:
5
1 5 -3 2 4
6
1 -2 3 4 -10 6
4
-3 -1 -2 -5
输出:
9
7
-1
#include<stdio.h>
#include<iostream>
using namespace std;
const int INF = 0x7fffffff;
const long long Max = 1e6 + 10;
long long a[Max];
//朴素的递归策略
long long Fun1(int n){
if(n == 0)
return a[n];
else
return max(Fun1(n-1)+a[n], a[n]);
}
//递归策略+记忆法
long long memo[Max];
long long Fun2(int n){
if(memo[n] != -1)
return memo[n];
if(n == 0)
memo[n] = a[n];
else
memo[n] = max(Fun1(n-1)+a[n], a[n]);
return memo[n];
}
//非递归
long long dp[Max];
void Fun3(int n){
for(int i = 0; i < n; i++){
if(i == 0)
dp[i] = a[i];
else
dp[i] = max(dp[i-1] + a[i], a[i]);
}
}
int main(){
int n;
while(cin >> n){
方法一
//for(int i = 0; i < n; i++)
// cin >> a[i];
//long long maxnum = -INF;
//for(int i = 0; i < n; i++){
// maxnum = max(maxnum , Fun1(i));
//}
//cout << maxnum << endl;
方法二
//fill(memo, memo + n, -1);
//for(int i = 0; i < n; i++)
// cin >> a[i];
//long long maxnum = -INF;
//for(int i = 0; i < n; i++){
// maxnum = max(maxnum , Fun2(i));
//}
//cout << maxnum << endl;
//方法三
fill(memo, memo + n, -1);
for(int i = 0; i < n; i++)
cin >> a[i];
long long maxnum = -INF;
fill(dp, dp + n, -1);
Fun3(n);
for(int i = 0; i < n; i++){
maxnum = max(maxnum , dp[i]);
}
cout << maxnum << endl;
}
}