import java.util.*; //子数组必须连续,子序列不用连续。 public class Solution { //dp[i] 表示以i位置元素结尾的最长上升子序列长度 //两种情况:1.单独i位置为一个子序列 //2.跟在前面某个子序列(最长)后面构成子序列 public int LIS (int[] arr) { // write code here //1.创建dp表 int n = arr.length; if(n==0) return 0; int[] dp = new int[n]; //2.初始化为1 for(int i=0;i<n;i++){ dp[i] = 1; } int ret = 1; //3.填表 for(int i=1;i<n;i++){ //此时就要寻找前面所有位置结尾中子序列最长的 //然后与当前结合 for(int j=0;j<i;j++){ //遍历前面所有的子序列,取最长 //保证前面选的子序列结尾元素小于i位置 if(arr[j] <arr[i]){ dp[i] = Math.max(dp[j]+1,dp[i]); } } ret = Math.max(ret,dp[i]); } return ret; } }