试题 算法提高 最大区间和
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给定n个数A1,A2,A3……An,求两个数l,r满足l<=r并最大化Al+A(l+1)+……Ar,输出这个最大值
输入格式
第一行一个数n,接下来一行有n个用空格隔开的数,第i个数表示Ai
输出格式
输出仅一行,即最大区间和
样例输入
4
-1 -2 -3 4
样例输出
4
数据规模和约定
每个数绝对值不超过2^30;
n<=1000000
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
int sum=0;
int max=-10001;//根据题目要求绝对值不超过10000,初始化最大值
for(int i=0;i<n;i++) {
arr[i]=sc.nextInt();
sum+=arr[i];
max=Math.max(max, sum);//sum和当前最大值比较,若sum更大,更新最大值
if(sum<0) {//如果累加和sum小于0,置为0
sum=0;
}
}
System.out.println(max);
}
}
读入优化:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException{
StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
int n=(int)in.nval;
int N=1000010;
long[] dp=new long[N];
for(int i=0;i<n;i++) {
in.nextToken();
dp[i]=(int)in.nval;
}
long sum=0,max=0;
for(int i=0;i<n;i++){
sum+=dp[i];
if(sum>max) {
max=sum;
}
if(sum<=0) {
sum=0;
}
}
if(max<=0) {
out.println(-1);
}else {
out.println(max);
}
out.flush();
}
}