连续和
题目描述:
给定n个数 a1 , a2 , … , an
定义 fi,j = ai + ai+1 + ai+2 + … + aj-1 + aj (1 ≤ i ≤ j ≤ n)
求 fi,j 的最大值
输入描述:
第一行有1个数,n
第二行有n个数,a1 , a2 , … , an
输出描述 Output Description
输出只有一行,fi,j 的最大值
样例输入:
7
3 6 -8 9 -12 1 2
样例输出 Sample Output
10
数据范围及提示:
样例中当 i = 1 , j = 4 时,fi,j = a1 + a2 + a3 + a4 = 3 + 6 - 8 + 9 = 10 为最大值
数据规模:
10%的数据 n = 7
30%的数据 n ≤ 1000
100%的数据 n ≤ 1000000 -1000 ≤ ai ≤ 1000 (1 ≤ i ≤ n)
我的代码:
import java.math.BigInteger;
import java.util.*;
public class CF470C {
// static int dir[][] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
static int maxn = (int) 1e9 + 7;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// int k=sc.nextInt();
int a[] = new int[2 * n + 1];
int sum[] = new int[2 * n + 1];
// int k = sc.nextInt();
long max1 = -maxn;
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
sum[i] = sum[i - 1] + a[i];
max1 = Math.max(max1, sum[i]);
}
System.out.println(max1);
}
}
大牛的代码:
#include<iostream>
using namespace std;
long long n,x,minn,ans=-100000000000,s[1000001];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
s[i]=s[i-1]+x;
}
for(int i=1;i<=n;i++)
{
ans=max(ans,s[i]-minn);
minn=min(minn,s[i]);
}
cout<<ans;
return 0;
}