问题描述:对给定数组A,寻找A的和最大的非空连续子数组。
输入格式:输入的第一行包括一个整数n,代表数组中的元素个数,接下来的一行包含n个整数(可以包含负数),以空格分隔。
输出格式:一个整数,表示最大的连续子数组的和。
样例输入:
9
2 4 -7 5 2 -1 2 -4 3
样例输出:
8
暴力法:
import java.util.Scanner;
public class mian13 {
public static int func(int a[]){
int max=0;
int n=a.length;
for(int i=0;i<n;i++){
int sum=0;
for(int j=i;j<n;j++){
sum+=a[j];
if(max<sum){
max=sum;
}
}
}
return max;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int a[]=new int[n];
for(int i=0;i<n;i++){
a[i]=scan.nextInt();
}
int max=func(a);
System.out.println(max);
}
}
动态解决:
每一步判断前一步的得出来的now_max对下一子个数组和有没有贡献,有贡献就加上,没贡献就now_max就更新为当前的数组值
上边的值判断完在和max比较求最大值
import java.util.Scanner;
public class main13_1 {
public static int func(int a[]){
int max=a[0],now_max=a[0];
int n=a.length;
for(int i=1;i<n;i++){
now_max=Math.max(now_max+a[i], a[i]);
if(now_max>max){
max=now_max;
}
}
return max;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int a[]=new int[n];
for(int i=0;i<n;i++){
a[i]=scan.nextInt();
}
int max=func(a);
System.out.println(max);
}
}
分治递归解决: