算法比较朴素:
1.定义一个数字,存放前缀和,如果前缀和比0小,那么,前缀和设置成0
2.取出最大的前缀和
此题的考点是,第二个用例都是负数,如果都是负数的话,其实只要选取最大的一个负数,代码修改一下就可以了
package info.frady.luogu;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class P1115 {
public static void main(String[] args) throws Exception{
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(reader.readLine());
int N=Integer.parseInt(st.nextToken());
st=new StringTokenizer(reader.readLine());
int[] sum=new int[N+1];
int max=0;
int maxF=-2087654321;
boolean flag=false;//是否是全负数
for (int i = 1; i <=N ; i++) {
int a=Integer.parseInt(st.nextToken());
sum[i]=sum[i-1]+a;
if(sum[i]<=0){
sum[i]=0;
}
if(sum[i]>max){
max=sum[i];
}
if(a>=0){
flag=true;
}
if(a>maxF){
maxF=a;
}
}
if(!flag){
System.out.println(maxF);
}else {
System.out.println(max);
}
reader.close();
}
}
本文介绍了一种求解最大子数组和的简单算法,通过维护一个前缀和变量,当其小于零时重置为零,从而找到数组中最大连续子数组的和。特别讨论了当数组全为负数时的特殊情况。
9095

被折叠的 条评论
为什么被折叠?



