当前位置: 首页 > news >正文

(动态规划 最长递增的子序列)leetcode 300

这道题我第一眼反应就是暴力,但是暴力的话就是n*n-1*n-2*...n-(n-1) 也就是O(n^n)dfs做绝对超时

贪心也不行,这里是子序列,要考虑在ni的范围内考虑多种路线取最优,所以用动态规划

如何用动态规划呢?

答:建立dp数组:每个dp存放0-i范围的子序列的最长递增子序列长度

用两个for循环

为什么不能用一个for循环?

答:比如0的长度为1,0-1的的最长子序列长度为1或者2

那0-3的最长子序列的长度就是3(nums3>nums2)或者2了嘛

这个只限于子串,子序列比较特殊,这里很难举例特殊例子,直接说明:

每个dp【i】代表着经过的路径,可以看成递归的归的父节点,dp【3】存放的可能是【2-3】,【1-3】【1-2-3】

所以用两个for循环外层为子序列最后结尾的最长长度,里层就遍历所有的子序列(因为每个dp【i】存放的是最优路径,所以dp[i]=max(dp[i],dp[j]+1) max里面 dp[i]就是上个子序列dp[j]+1,和现在dpj的最优路径加上nums【i】构成的子序列比较长度

//这里举例的数字是 1 3 5 8

题目

#include <vector>
#include <algorithm>

class Solution {
public:
    int lengthOfLIS(std::vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;

        std::vector<int> dp(n, 1); 
        int ans = 1;

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

相关文章:

  • vue3+TS使用i18n.global.locale,页面要刷新时才更新
  • SQL Server Management Studio的使用
  • 运维Splunk面试题及参考答案
  • (上)基于机器学习的图像识别——遥感图像分类(LeNet-5;AlexNet;VGGNet;GoogLeNet;ResNet)
  • 局域网自动识别机器名和MAC并生成文件的命令
  • 自然语言处理NLP入门 -- 第九节NLP 实战项目 1:情感分析系统
  • 学习dify第二天-web前篇
  • 【C++】防止机械/移动硬盘休眠 - NoSleepHD
  • start DL from stratch (2)!!!
  • 【AI+智造】南京江北新区制造业特点分析及智慧设备运维诊断开发方案
  • RocketMQ的运行架构
  • [特殊字符]【CVPR2024新突破】Logit标准化:知识蒸馏中的自适应温度革命[特殊字符]
  • 中科大 计算机网络原理 第一章 1.6分组延迟、丢失和吞吐量 笔记
  • 如何把网络ip改为动态:全面指南
  • 一个基于C# Winform开源免费的通用快速开发框架,内置完整的权限架构!
  • python爬虫报错信息解决方法
  • C++22——哈希
  • 基于Springboot博物馆文博资源库系统【附源码】
  • 传输层协议TCP
  • Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比
  • 更改wordpress菜单字体/seo优化关键词排名
  • 北京网站建设龙鹏/线下推广有哪些渠道
  • 广州市酒店网站设计/智能建站
  • 什么网站可以做机票行程单/杭州网站
  • java 视频网站开发/域名备案查询系统
  • 阿里大鱼Wordpress/怎么优化推广自己的网站