力扣HOT100之动态规划:300. 最长递增子序列

这道题之前刷代码随想录的时候也刷过,现在又给忘完了。自己尝试着写了一下,发现怎么写都写不对,直接去看视频了。。我自己写的时候的定义是:考虑下标0 ~ i范围内索赔能取到的最长严格递增子序列的长度,后面发现在写递推公式的时候怎么都写不对,这道题的dp数组的含义为:以nums[i]为结尾的情况下,其最长严格递增子序列的长度。那么递推公式就很好想了,在以nums[i]为结尾的情况下,我们从头开始搜索,如果遇到nums[j] < nums[i]的情况,则说明nums[i]可以作为以nums[j]结尾的子序列的下一个元素,我们需要对比dp[j] + 1dp[i]之间的大小关系,取较大值作为新的dp[i]。遍历顺序也很好想,二重循环都是从小到大遍历的。下面写下递归五部曲:

1.确定dp[i]的含义:以nums[i]为结尾的情况下,其最长严格递增子序列的长度

2.确定递推公式 dp[i] = max(dp[j] + 1, dp[i]) (只有nums[i] > nums[j]才会触发)

3.dp数组初始化 dp[0] = 1

4.确定遍历顺序:从左往右遍历

5.打印数组(省略)

值得注意的是,我们最终要返回的不一定是dp[s.size() - 1],因为最后一个元素不一定是最大元素,最大元素可能在前面的任意位置,例如数组[0, 1, 2, 3, 4, 5, 1],最大长度在元素5这里产生,我们需要用一个额外变量result来维护最大长度。

cpp 复制代码
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        //1.确定dp[i]的含义:以nums[i]为结尾的情况下,其最长严格递增子序列的长度
        //2.确定递推公式  dp[i] = max(dp[j] + 1, dp[i]) (只有nums[i] > nums[j]才会触发)
        //3.dp数组初始化 dp[0] = 1  
        //4.确定遍历顺序:从左往右遍历
        //5.打印数组(省略)
        int n = nums.size();
        vector<int> dp(n, 1);
        int result = 1;   //用于记录整个数组中的最长子序列的长度
        //初始化
        dp[0] = 1;
        for(int i = 1; i < n; i++){   //逐渐扩大数组范围
            for(int j = 0; j < i; j++){   //内循环则确定nums[i]为结尾的情况下所能取到的最长严格递增子序列的长度
                if(nums[i] > nums[j])  //nums[i]可以作为以nums[j]结尾的子序列的下一个元素时
                    dp[i] = max(dp[j] + 1, dp[i]);
            }
            result = max(result, dp[i]);  //维护最长严格递增子序列的长度
        }
        return result;
    }
};
相关推荐
仰泳的熊猫2 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
无极低码6 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发6 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre7 小时前
22 括号生成
算法·深度优先
努力也学不会java8 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎8 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan8 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业9 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe9 小时前
C++并发编程中的死锁避免
开发语言·c++·算法