/** * 采用动态规划找出数组的最长的递增子序列 */ public class LongestSub { /** * * 从上面的分析中找到规律,即dp[i]的值是前面所有小于arr[i]的数组的dp[i]的最大值+1; */ public static void main(String[] args) { int [] arr = {9,10,19,20,21,22,11,12,13,14,15}; int len = arr.length; int [] dp = new int[len]; Arrays.fill(dp , 1);//采用1填充数组 这时dp[0] = 1 了 for(int i = 1; i < len; i++){ int max = -1; for(int w = 0; w < i; w++){ if(arr[w] < arr[i]){ max = Math.max(max,dp[w]); dp[i] = max +1; } } } int length = dp[0]; System.out.print(" 原始数组为:"); for(int k = 0; k < len; k++){ System.out.print(arr[k] + " "); } System.out.println(); System.out.print("递增子序列长度数组为:"); for(int i = 0; i < len; i++){ System.out.print(dp[i] + " "); if(length < dp[i]){ length = dp[i]; } } System.out.println(); System.out.println("递增子序列的最大长度为: "+length); //打印最长的递增子序列 List<Integer> list = new ArrayList<>(); int m = len - 1; for(int q = length; q >= 1; q-- ){ for(int k = m ; k >= 0; k--){ if(dp[k] == q){ list.add(arr[k]); m = k-1; break; } } } for(int k = list.size() - 1; k >= 0; k--){ System.out.print(list.get(k) + " "); } } }