算法DAY52 动态规划10 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

news2024/11/18 3:42:34

300.最长递增子序列

五部曲:
1、dp数组的含义:
dp[ i ] : 代表 截至到nums[i] (包括 nums[i]) 的序列中,以nums[i] 结尾的,最长递增子序列的长度。这里强调以nums[i] 结尾,是因为还要跟nums[j]做对比,确定是不是递增的。
2、递推公式
if(nums[i] > nums[j]) dp = max(dp[i],dp[j]+1)
注意:dp[i] 随着j可能会变化多次,所以其实是在取满足条件的 dp[j]+1的最大值
3、初始化
对于每一个单独的nums[i],连续子序列都是1
4、遍历顺序
j从0~i-1,无所谓前后。但是dp[i] 依赖于dp[i-1],所以必须从前向后遍历
5、举例推导
在这里插入图片描述

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size(),1);
        int res = 0;
        for(int i = 1; i < nums.size(); ++i){
            for(int j = 0; j < i; ++j){
                if(nums[i] > nums[j])dp[i] = max(dp[i],dp[j]+1);
            }
            if(dp[i] > res) res = dp[i];
        }

        return res == 0 ? 1 : res;
    }
};

674. 最长连续递增序列

本题可以直接用暴力写出来。

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        int res = 0;
        int count = 1;
        for(int i = 1; i< nums.size(); ++i ){
            if(nums[i] > nums[i-1]){
                count++;
                if(count > res) res = count;
                continue;
            }
            else{
                count = 1;
            }
            
        }
        return res == 0 ? 1 : res;
    }
};

动态规划:
1、dp[i] : 以nums[i]结尾的序列,最长连续递增子序列的长度
2、递推公式
因为要是连续子序列,所以只能是当dp[i] > dp[i-1] 时,dp[i] = dp[i-1] + 1;
3、初始化
都是1
4、遍历顺序
从前向后

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        vector<int> dp(nums.size(),1);
        int res = 1;
        for(int i = 1; i < nums.size(); ++i){
            if(nums[i] > nums[i-1]) dp[i] = dp[i-1] + 1;
            if(dp[i] > res) res = dp[i];
        }
        return res;
    }
};

718. 最长重复子数组

1、dp[i][j] : 以A[i-1], B[j-1]为结尾的A B字符串的最大重复子序列。
不定义成以A[i], B[j]为结尾的A B字符串的最大重复子序列,是因为会多一步初始化的步骤,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。 nums2[j] 与 nums1[0]相同的话,同理。

// 要对第一行,第一列经行初始化
        for (int i = 0; i < nums1.size(); i++) if (nums1[i] == nums2[0]) dp[i][0] = 1;
        for (int j = 0; j < nums2.size(); j++) if (nums1[0] == nums2[j]) dp[0][j] = 1;

而 以A[i-1], B[j-1]为结尾的A B字符串的最大重复子序列这种定义里,dp[i][0], dp[0][j] 是无意义的 。但是依然需要初始化为0,因为会依赖i-1,j-1。假设A[0] = B[0],dp[1][1] = dp[0][0] + 1。

不太好理解,还是看 : 以A[i], B[j]为结尾的A B字符串的最大重复子序列,这个定义。
2、递推公式

if (nums1[i] == nums2[j] && i > 0 && j > 0) { // 防止 i-1 出现负数
    dp[i][j] = dp[i - 1][j - 1] + 1;
}

3、初始化
在定义中已经提及
4、遍历顺序
从前向后

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp(nums1.size(),vector<int>(nums2.size() , 0));
        for(int i = 0; i< nums1.size();i++) {
            if(nums2[0] == nums1[i]){
                dp[i][0] = 1;
            }
        }
        for(int j = 0; j< nums2.size();j++) {
            if(nums1[0] == nums2[j]){
                dp[0][j] = 1;
            }
        }
        int res = 0;
        for(int i = 0; i < nums1.size();++i){
            for(int j = 0; j < nums2.size();++j){
                if(nums1[i] == nums2[j] && i>0 && j >0){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }
                if(res < dp[i][j]) res = dp[i][j];
            }
        }
        return res;
    }
};

其中两层for都要从0开始,因为要把dp[i][0] dp[0][j] 的最大值给到res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ACG-crcme1(★★★)

运行程序 info exit 查壳 没壳 载入OD分析 刚载入OD发现要使用 ACG.key 搜一下字符串看看 发现这有貌似成功相关的字符串 进去看看 可以找到关键跳 爆破的话直接在这就可以完成 上面就该是算法了 算法分析 开始先判断文件存在和文件内容大小 读取文件内容&am…

微前端 qiankun@2.10.5 源码分析(二)

微前端 qiankun2.10.5 源码分析&#xff08;二&#xff09; 我们继续上一节的内容。 loadApp 方法 找到 src/loader.ts 文件的第 244 行&#xff1a; export async function loadApp<T extends ObjectType>(app: LoadableApp<T>,configuration: FrameworkConfi…

uniapp - 实现微信小程序电子签名板,横屏手写姓名签名专用写字画板(详细运行示例,一键复制开箱即用)

效果图 实现了在uniapp项目中,微信小程序平台流畅的写字签名板(也可以绘图)功能源码,复制粘贴,改改样式几分钟即可搞定! 支持自动横屏、持预览,真机运行测试非常流畅不卡顿。 基础模板 如下代码所示。 <template><view class=

vue3.2+vite+vant4+sass搭建笔记

1、确定node版本 1、下载nvm安装包 官方下载地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases 双击安装 2、在node官网下载安装多个node 3、切换node 2、创建项目 1、安装依赖 pnpm i 2、启动项目 npm run dev 3、配置指向src import { defineC…

FAST协议解析2 FIX Fast Tutorial翻译【PMap、copy操作符】

FIX Fast Tutorial FIX Fast教程 &#xff08;译注&#xff1a;本篇是对https://jettekfix.com/education/fix-fast-tutorial/翻译和解释&#xff0c;除了文本的直接翻译外&#xff0c;我还针对各点按我的理解进行了说明和验证&#xff0c;所以可以看到译文下会有很多译注&am…

虹科方案 | HK-Edgility:将 SASE 带到边缘

通过上期的文章&#xff0c;我们了解到虹科HK-Edgility软件系统《面向未来的安全SD-WAN》的解决方案。本篇文章&#xff0c;我们将带您了解虹科系统在SASE的方案简介。 一、时代背景 向软件即服务 (SaaS) 和云原生应用程序的过渡&#xff0c;加上越来越多的远程用户生成和访问公…

快来参与:2023全国大数据与计算智能挑战赛正在报名中

全国大数据与计算智能挑战赛是由国防科技大学系统工程学院大数据与决策实验室组织的年度赛事活动&#xff0c;旨在深入挖掘大数据应用实践中亟需破解的能力生成难题、选拔汇聚数据领域优势团队、促进大数据领域的技术创新和面向需求的成果生成、推动形成“集智众筹、联合攻关、…

Spring项目的创建与使用

一、创建Spring项目 这里使用Maven方式创建Spring项目&#xff0c;分为以下三步&#xff1a; 创建一个普通的Maven项目添加spring框架支持添加启动类 注&#xff1a;这里创建的是一个spring的core项目&#xff0c;不是web项目&#xff0c;只需要main方法&#xff0c;不需要t…

Ubuntu显示美化 优化 常用插件

Ubuntu显示美化 优化 常用插件 1. 安装 Extension Manager2. 网速显示&#xff08;不显示总流量记得关掉&#xff09;3. 顶部透明度4. 左侧dock导航透明度5. 过渡动画2022-01-22 毛玻璃效果 和 程序启动背景墙效果2022-01-23 窗口预览&#xff08;类windos多窗口&#xff09;20…

C++11实现线程池

1.所有权的传递 适用移动语义可以将一个unique_lock赋值给另一个unique_lock,适用move实现。 void myThread1() {unique_lock<mutex> myUnique (testMutex1,std::defer_lock);unique_lock<mutex>myUnique1(std::move(myUnique));//myUnique 则实效 myUnique1 相当…

在Linux中进行Jenkins部署(maven-3.9.1+jdk11)

Jenkins部署在公网IP为x.x.x.x的服务器上 maven-3.9.1要安装在jdk11环境中 环境准备 第一步&#xff0c;下载jdk-11.0.19_linux-x64_bin.tar.gz安装包。 登录地址&#xff1a;Java Downloads | Oracle 下载jdk-11.0.19_linux-x64_bin.tar.gz安装包&#xff0c;然后使用Win…

电子温湿度记录仪

电子温湿度记录仪&#xff1a;实时监测环境温度和湿度电子温湿度记录仪是一种用于实时监测环境温度和湿度的设备。它广泛应用于医疗、制药、食品加工、仓储、博物馆、实验室等领域&#xff0c;以确保环境温湿度处于合适的范围内&#xff0c;以保持物品和设备的稳定性和安全性。…

信号的产生——tripuls函数

信号的产生——tripuls函数, 功能&#xff1a;产生非周期三角波信号&#xff0c;其调用格式如下&#xff1a; &#xff08;1&#xff09;ytripuls(t)&#xff0c; &#xff08;2&#xff09;ytripuls(t,w)&#xff0c; &#xff08;3&#xff09;ytripuls(t,w,s)&#xff0…

Java多线程入门到精通学习大全?深入了解线程:生命周期、状态和优先级!(第二篇:线程的基础知识学习)

本文详细介绍了线程的基础知识&#xff0c;包括什么是线程、线程的生命周期、线程的状态和线程优先级等。在了解这些知识后&#xff0c;我们能够更好地掌握线程的使用方式&#xff0c;提高程序的并发性和效率。如果您对线程有更深入的问题&#xff0c;也欢迎向我们提问。 1. 什…

华为MPLS跨域——后门链路实验配置

目录 配置PE与CE设备对接命令&#xff08;通过OSPF对接&#xff09; 配置后门链路 可以使用任意方式来跑跨域MPLS&#xff08;A、B、C1、C2都可以&#xff09;&#xff0c;不过关于传递Vpnv4路由的配置此处不做介绍&#xff1b;此处只介绍关于PE和CE对接的配置和关于后门链路…

node.js的核心模块

node的核心模块由一些精简而高效的库组成 文章目录 全局对象全局对象和全局变量processcosole utilutils.inheritsutils.inspect 事件机制事件发射器error 事件继承EventEmitter 文件系统访问fs.readFile(filename,[encoding],[callback(err,data)])fs.readFileSync(filename,…

NSSCTF (2)

[GKCTF 2020]cve版签到 查看响应头发现有几个可能利用的信息 1.hint 里面的Flag in localhost 2.apache 2.4.38 3. php 7.3.15 我们发现第一个是提示 第二个apache版本没有什么漏洞 但是php 7.3.15 存在cve漏洞 这里题目规定 *.ctfhub.com 所以我们 要以这个结尾 在 p…

05-事务管理

概念&#xff1a; 事务是一组操作的集合&#xff0c;它是不可分割的工作单位&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 操作&#xff1a; 开启事务&#xff08;一组操作开始前&#xff0c;开启事务) : start transaction / begin ; 提交事务&#xff08;这组操…

【LeetCode】1000题挑战(230/1000)

1000题挑战 没有废话&#xff0c;直接开刷&#xff01; 目录 1000题挑战 没有废话&#xff0c;直接开刷&#xff01; 第一题&#xff1a;242. 有效的字母异位词 - 力扣&#xff08;Leetcode&#xff09; 题目接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; …

罗马数字转整数:探究古代数字编码的奥秘

本篇博客会讲解力扣中“13. 罗马数字转整数”这道题的解题思路。 大家先来审下题&#xff1a;题目链接。 题干如下&#xff1a; 有几个输出样例&#xff1a; 提示如下&#xff1a; 大家先思考一下&#xff0c;再来听我讲解。 本题的关键是&#xff1a;如何把罗马数字转换…