import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 给定数组的最长严格上升子序列的长度。
     * @param arr int整型一维数组 给定的数组
     * @return int整型
     */
    public int LIS (int[] arr) {
        // write code here

        // 算法核心思想:动态规划

        // 处理特殊情况
        if (arr.length == 0) {
            return 0;
        }

        // dp[i] - 表示以i位置元素为结尾的最长严格上升子序列的长度
        // i - 从0(左)往n(右)推
        int[] dp = new int[arr.length];

        // 初始化dp
        // 当只有0位置元素时,上升子序列仅有其自己,故长度为1
        dp[0] = 1;

        // 递推dp
        int result = 1;
        for (int i = 1; i < arr.length; i++) {
            int max = 1;
            // 求解dp[i],观察dp[0 ~ i-1]的所有位置,若有小于arr[i]的,就尝试让arr[i]接在其后面,+1
            for (int j = 0; j < i; j++) {
                // 先假设以arr[j]为结尾的最长严格上升子序列只有它自己
                int length = 1;
                if (arr[j] < arr[i]) {
                    // arr[i]可以接在以arr[j]为结尾的最长上升子序列后面
                    length = dp[j] + 1;
                }
                // 更新max
                if (length > max) {
                    max = length;
                }
            }
            // 根据max记录dp[i]
            dp[i] = max;
            // 更新最终的结果,及所有位置中最大的那个值
            if (dp[i] > result) {
                result = dp[i];
            }
        }
        return result;
    }
}