算法基础之最长上升子序列

2023-12-25 18:19:29

最长上升子序列

  • 核心思想:线性dp

    • 明确f[N]集合定义 : 以第i个数结尾的最长子序列

    • 计算 : a[j]为 a[i] 前面一个数值 若f [j] + 1 > f [i] 则f [i] = f [j] + 1 所以 f[i] = max(f[i] , f[j] + 1)

    • 在这里插入图片描述

    •   #include<iostream>
        #include<algorithm>
        #include<cstring>
        
        using namespace std;
        const int N = 1010;
        
        int f[N],a[N];
        int n;
        
        int main()
        {
            cin>>n;
            for(int i=1;i<=n;i++) cin>>a[i];  //a存数值
            
            for(int i=1;i<=n;i++)
            {
                f[i] = 1;  //用到i的时候初始化成1 (子序列只有自己)
                for(int j = 1;j<i;j++)  //j<i 遍历i之前所有数
                {
                    if(a[j] < a[i]) f[i] = max(f[i] , f[j] + 1); 
                }
            }
            
            int res = 0;  //遍历所有f[i] 找到最大的
            for(int i=1;i<=n;i++) res = max(res , f[i]);
            
            cout<<res;
        }
      

文章来源:https://blog.csdn.net/Pisasama/article/details/135202010
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。