可视化算法——最长上升子序列(LIS)

题目

小明是蓝桥王国的骑士,他喜欢不断突破自我。

这天蓝桥国王给他安排了 N N N 个对手,他们的战力值分别为 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an,且按顺序阻挡在小明的前方。对于这些对手小明可以选择挑战,也可以选择避战。

身为高傲的骑士,小明从不走回头路,且只愿意挑战战力值越来越高的对手。

请你算算小明最多会挑战多少名对手。

输入描述

输入第一行包含一个整数 N N N,表示对手的个数。

第二行包含 N N N 个整数 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an,分别表示对手的战力值。

1 ≤ N ≤ 3 × 1 0 5 1 \leq N \leq 3 \times 10^5 1N3×105 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109

输出描述

输出一行整数表示答案。

输入输出样例

示例 1

输入

6
1 4 2 2 5 6

输出

4

题解

方法 时间复杂度 适用场景
动态规划 O(n²) 小规模数据(n ≤ 1e4)
贪心 + 二分 O(n log n) 大规模数据(n ≤ 1e5)

1. 动态规划版(五个检测点只有一个通过,其余全部超时)

时间复杂度:O(n²),适合 n ≤ 1e4 的场景。题目要求3e5。
核心思想:用 dp[i] 表示以 nums[i] 结尾的最长上升子序列长度。

#include 
#include 
#include 
using namespace std;
int main()
{
   
    // 请在此输入您的代码
    int n,maxlen=1;
    cin>>n;
    vector<int> num(n);
    for(int i=0;i<n;i++)<

你可能感兴趣的:(算法,c++)