其他分享
首页 > 其他分享> > 300. 最长递增子序列

300. 最长递增子序列

作者:互联网

✅做题思路or感想

这种“最长递增子序列”是经典的动态规划的题,虽然我在看到的第一瞬间并没有反应过来用dp,可惜

dp数组含义

dp[i],以nums[i]结尾的最大递增子序列的长度

推导公式

nums[i] > nums[j] 时: nums[i]可以接在nums[j] 之后(此题要求严格递增),此情况下最长上升子序列长度为dp[j] + 1

if (nums[i] > nums[j]) {
    dp[i] = max(dp[i], dp[j] + 1);
}

后面要注意dp[i] = max(dp[i], dp[i - 1] + 1)中不是dp[i]dp[i - 1] + 1,而是去取dp[i - 1] + 1的最大值

初始化

因为最少的子序列的长度为1,所以一律初始化为1就好了

遍历顺序

从小推大,所以是正序

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        //dp[i],以nums[i]结尾的最大递增子序列的长度
        vector<int>dp (nums.size(), 1);
        int result = 1;
        for (int i = 0; i < nums.size(); ++i) {
            for(int j = 0; j < i; ++j) {
                if (nums[i] > nums[j]) {
                    dp[i] = max(dp[i], dp[j] + 1);
                }
            }
            result = max(result, dp[i]);
        }
        //这里return的不是dp[nums.size() - 1]!!!!
        //这里要想dp数组的意义,dp[nums.size() - 1]是指nums[nums.size() - 1]为结尾的最长递增子序列,而不是全局的最长的递增子序列!所以这里要return全局的!
        return result;
    }
};

标签:nums,300,递增,int,序列,dp,size
来源: https://www.cnblogs.com/doomaa/p/16112756.html