//给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度。
//所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如[1, 5, 3, 7, 3] 数组,其子序列有:[1, 3, 3]、[7] 等。但[1, 6]、[1, 3, 5] 则不是它的子序列。
//我们定义一个序列是严格上升的,当且仅当该序列不存在两个下标i和j满足 i < j且 arr[i] >= arr[j]
//数据范围:0≤n≤1000
//要求:时间复杂度 O(n^2), 空间复杂度 O(n)
int LIS(vector<int>& arr)
{
int result = 0;
int length = arr.size();
vector<int> amount(length);//amount[i]存放0-i的最长上升子序列的长度
for (int i = 0; i < length; ++i)
{
int m = 0;
for (int j = i - 1; j >= 0; --j)
{
//向前寻找最后元素比arr[i]小的最长上升子序列的长度
if (arr[j] < arr[i] && amount[j] > m)
{
m = amount[j];
}
}
int num = m + 1;
amount[i] = num;
if (num > result) result = num;
}
return result;
}