连续最大和
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
输入描述:
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:
所有连续子数组中和最大的值。
输入
3 -1 2 1
输出
3
动态规划求解:
状态:以第i个元素结尾的最大连续和
状态递归:F(i)=max(F(i-1)+a[i],a[i])
初始值:F(0)=a[0]
返回值:max(F(i))——返回F(i)中的最大值
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for(int i=0;i<n;i++){
nums[i] = sc.nextInt();
}
int maxNum = nums[0];
int curMax = nums[0];
for(int i=1;i<n;i++){
curMax = Math.max(curMax+nums[i],nums[i]);
if(curMax>maxNum){
maxNum = curMax;
}
}
System.out.println(maxNum);
}
}
注意:
如果想要静态导入Math,可以import static java.lang.Math.*
。
将每一次的最大值都记录下来:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = 0;
while(sc.hasNext()){
n = sc.nextInt();
int[] num = new int[n];
for(int i=0;i<n;i++){
num[i] = sc.nextInt();
}
int result = maxArry(num,n);
System.out.println(result);
}
}
public static int maxArry(int[] array,int len) {
if(array == null || len <= 0) {
return -1;
}
//先设最大值为int的类型的最小值-2147483648
int maxnum = 0x80000000;
//System.out.println(maxnum);
int sum = 0;
for(int i = 0;i < len;i++) {
if(sum <= 0) {
sum = array[i];
}else{
sum += array[i];
}
if(sum > maxnum) {
maxnum = sum;
}
}
return maxnum;
}
}
注意:
0x80000000是int类型的最小值-2147483648
0x80000000: 1000 0000 0000 0000 0000 0000 0000:-2147483648
来源:牛客网