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;
    }
}