1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class MaxSubSeq { 5 // 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。 6 // 状态转移方程: sum[i]=max(sum[i-1]+a[i],a[i]) 7 // 如果全是负数{ -2, -11, -4, -13, -5, -2 } 8 9 // 获取最大子序列之和 10 public static int getSumOfMaxSubSeq(int[] arr) { 11 int sum = 0; 12 int max = arr[0]; 13 14 for(int i = 0; i < arr.length; i++) { 15 sum += arr[i]; 16 17 if (sum > max) { 18 max = sum; 19 } 20 21 if (sum < 0) { 22 sum = 0; 23 } 24 } 25 26 return max; 27 } 28 29 // 获取最大子序列 30 public static ArrayList<Integer> getMaxSubSeq(int[] arr) { 31 int sum = 0; 32 int max = arr[0]; 33 ArrayList<Integer> list = new ArrayList<Integer>(); // 存储最大子序列 34 ArrayList<Integer> tempList = new ArrayList<Integer>(); // 存储临时序列 35 36 for(int i = 0; i < arr.length; i++) { 37 sum += arr[i]; 38 tempList.add(arr[i]); 39 40 if (sum > max) { 41 max = sum; 42 list.clear(); 43 copy(tempList, list); 44 } 45 46 if (sum < 0) { 47 sum = 0; 48 tempList.clear(); 49 } 50 } 51 52 return list; 53 } 54 55 // 深度copy ArrayList 56 public static void copy(List src,List dest){ 57 for (int i = 0 ;i < src.size() ; i++) { 58 Object obj = src.get(i); 59 if (obj instanceof List){ 60 dest.add(new ArrayList()); 61 copy((List)obj,(List)((List)dest).get(i)); 62 }else{ 63 dest.add(obj); 64 } 65 } 66 } 67 68 public static void main(String[] args) { 69 int[] arr = { -2, 11, -4, 13, -5, -2 }; 70 71 int max = getSumOfMaxSubSeq(arr); 72 System.out.println("最大子序列之和: " + max); 73 74 ArrayList<Integer> list = getMaxSubSeq(arr); 75 for(Integer integer: list) { 76 System.out.println("最大子序列: " + integer); 77 } 78 } 79 }