最长上升子序列
传统LIS问题
-
对于长度为的序列,求其严格上升的子序列的长度。
-
首先回顾一下最长上升子序列问题,有的解法和的贪心+二分解法。
-
注意:此类问题要注意是否严格递增。
板子
//n^2做法
int LIS(vector<int> &A)
{
int n = A.size();
if (n == 0)
return 0;
vector<int> dp(n, 0);
for (int i = 0; i < n; ++i)
{
dp[i] = 1;
for (int j = 0; j < i; ++j)
{
if (A[j] < A[i]) //严格递增,非严格递增修改成<=
dp[i] = max(dp[i], dp[j] + 1);
}
}
return *max_element(dp.begin(), dp.end());
}
二分+贪心做法
//nlogn做法
int LIS(vector<int> &A)
{
int N = A.size();
if (N == 0)
return 0;
vector<int> dp(N + 1, INF);
for(int i = 0; i < N; ++i)
{
int z = lower_bound(dp.begin(),dp.end(), A[i]) - dp.begin();//严格递增,非严格递增修改成upper_bound
dp[z] = A[i];
}
int ans = lower_bound(dp.begin(),dp.end(), INF) - dp.begin();
return ans;
}
我觉得cf1437E是一道好题,大家可以去尝试一下。