讲解一个简单的动态规划的小例题!
给定一个长度为N的数组(A[0], A[1],...,A[n-1], A[n]),这个数组有很多子数组,求一个连续的子数组,使得它们各个元素之和是最大的!
import java.util.Scanner;
public class Maxsubarr {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
//例子
// 5 {-1, 2, 3, -4, 2} max:5
// 6 {1, -2, 3, 5, -3, 2} max:8
// 6 {0, -2, 3, 5, -1, 2} max:9
int max = arr[0];// 去数组第一个数默认为最大值
for (int i = 1; i < arr.length; i++) {// 往后递推
// 对于第i个数,它有两个选择:1,它不加它的前一个数arr[i-1];2,加上arr[i-1];加与不加做一个比较,取一个较大的出来赋给temp
int temp = Math.max(arr[i], arr[i - 1] + arr[i]);
arr[i] = temp;// 更新arr[i]的值
max = temp > max ? temp : max;// 如果temp大于当前的max,那么max更新为temp
}
System.out.println(max);
}
}