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