清华大学2006年机试-最大序列和-1077
题目描述:
给出一个整数序列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
解题思路:
一道比较经典的动态规划的题目,动态转移方程为sum[i] = max{sum[i-1] + data[i], data[i]}。然后从sum数组中找到最大的值,结果即是最大序列和。
AC代码:
#include <cstdio>
typedef long long ll;
const int maxn = 1000010;
ll data[maxn];
int N;
ll max(ll a, ll b){
return a>b?a:b;
}
ll maxSubStr(int N){
ll sum[N];
sum[0] = data[0];
for(int i = 1; i < N; i++){
sum[i] = max(sum[i-1]+data[i], data[i]);
}
ll ans = -1;
for(int i = 0; i < N; i++){
if(sum[i] > ans) ans = sum[i];
}
return ans;
}
int main(){
freopen("C:\\Users\\Administrator\\Desktop\\test.txt", "r", stdin);
while(scanf("%d", &N) != EOF){
for(int i = 0; i < N; i++){
scanf("%lld", &data[i]);
}
printf("%lld\n", maxSubStr(N));
}
fclose(stdin);
return 0;
}