[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解

目录


0.子序列 vs 子数组

  • 子序列
    • 相对顺序是跟源字符串/数组是一致的
    • 但是元素和元素之间,在源字符串/数组中可以是不连续的
    • 一般时间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 子数组
    • 在源字符串/数组中挑出来,必须是连续的
      • 子串与子数组是一个意思
    • 一般时间复杂度: O ( N 2 ) O(N^2) O(N2)
  • 子序列其实相当于包含了子数组
  • 子序列问题经典解法:两层循环

1.最长递增子序列

1.题目链接


2.算法原理详解

  • 注意:本题思考方式非常有标志性
  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置元素为结尾的所有子序列中,最长递增子序列的长度
    • 推导状态转移方程

    • 初始化:vector<int> dp(n, 1)

    • 确定填表顺序:从左往右

    • 确定返回值:整个dp表里的最大值


3.代码实现

cpp 复制代码
int lengthOfLIS(vector<int>& nums) 
{
    int n = nums.size();
    vector<int> dp(n, 1);

    int ret = 1;
    for(int i = 1; i < n; i++)
    {
        for(int j = 0; j < i; j++)
        {
            if(nums[j] < nums[i])
            {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }

        ret = max(ret, dp[i]);
    }

    return ret;
}

2.摆动序列

1.题目链接


2.题目链接

  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置元素为结尾的所有子序列中,最长的摆动序列的长度
      • 本题状态标识还可以继续划分
        • f[i]:以i位置元素为结尾的所有子序列中,最后一个位置呈现"上升"趋势的最长的摆动序列的长度
        • g[i]:以i位置元素为结尾的所有子序列中,最后一个位置呈现"下降"趋势的最长的摆动序列的长度
    • 推导状态转移方程

      • ji前面的任一一个数
    • 初始化:vector<int> f(n, 1), g(n, 1)

    • 确定填表顺序:从左往右,两个表一起填

    • 确定返回值:两个dp表里的最大值


3.代码实现

cpp 复制代码
int wiggleMaxLength(vector<int>& nums) 
{
    int n = nums.size();
    vector<int> f(n, 1), g(n, 1);

    int ret = 1;
    for(int i = 1; i < n; i++)
    {
        for(int j = 0; j < i; j++)
        {
            if(nums[j] < nums[i])
            {
                f[i] = max(f[i], g[j] + 1);
            }
            else if(nums[j] > nums[i])
            {
                g[i] = max(g[i], f[j] + 1);
            }
        }

        ret = max(ret, max(f[i], g[i]));
    }

    return ret;
}
相关推荐
罗西的思考12 小时前
【Agent】 ACE(Agentic Context Engineering)源码阅读笔记---(3)关键创新
人工智能·算法
报错小能手13 小时前
C++笔记(面向对象)静态联编和动态联编
开发语言·c++·算法
WBluuue13 小时前
AtCoder Beginner Contest 430(ABCDEF)
c++·算法
小肖爱笑不爱笑13 小时前
2025/11/5 IO流(字节流、字符流、字节缓冲流、字符缓冲流) 计算机存储规则(ASCII、GBK、Unicode)
java·开发语言·算法
熬了夜的程序员13 小时前
【LeetCode】99. 恢复二叉搜索树
算法·leetcode·职场和发展
Kent_J_Truman13 小时前
LeetCode Hot100 自用
算法·leetcode·职场和发展
还是码字踏实13 小时前
算法题种类与解题思路全面指南:基于LeetCode Hot 100与牛客Top 101
算法·leetcode
Victory_orsh14 小时前
“自然搞懂”深度学习(基于Pytorch架构)——010203
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
CoovallyAIHub15 小时前
突破360°跟踪极限!OmniTrack++:全景MOT新范式,HOTA指标狂飙43%
深度学习·算法·计算机视觉
得物技术15 小时前
得物管理类目配置线上化:从业务痛点到技术实现
后端·算法·数据分析