最大数
题目描述:
N个数围成一圈,要求从中选择若干个连续的数(注意每个数最多只能选一次)加起来,问能形成的最大的和。
输入描述:
第一行输入N,表示数字的个数,第二行输入这N个数字。
输出描述 Output Description
输出最大和。
样例输入:
8
2 -4 6 -1 -4 8 -1 3
样例输出:
14
数据范围及提示:
数据说明:
40% 1<=N<=300
60% 1<=N<=2000
100% 1<= N<=100000,答案在longint范围内。
我的代码:
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]);
}
for (int i = n + 1; i <= 2 * n; i++) {
a[i] = a[i - n];
sum[i] = sum[i - 1] + a[i];
//max1=Math.max(max1,sum[i]-sum[i])
}
int ans=0,sum2=0;
for(int i=0;i<2*n;i++)
{
sum2+=a[i];
if(ans<sum2)
ans=sum2;
if(sum2<0)
sum2=0;
}
System.out.println(sum2);
}
}
大牛的:
#include<iostream>
using namespace std;
int n,maxn,minn,ans=-10000000,x,s[100001];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
s[i]=s[i-1]+x;
}
maxn=minn=s[n];
for(int i=n-1;i>=1;i--)
{
ans=max(ans,max(maxn-s[i],s[n]+s[i]-minn));
maxn=max(s[i],maxn);
minn=min(s[i],minn);
}
cout<<ans;
return 0;
}