[Algorithm][动态规划][子序列问题][最长递增子序列的个数][最长数对链]详细讲解

目录

  • 1.最长递增子序列的个数
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.最长数对链
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.最长递增子序列的个数

1.题目链接

  • 最长递增子序列的个数

2.算法原理详解

  • 注意:本题思路和思维方式及用到的方法很值得考究,个人感觉很有含金量,且初见不好理解
  • 前置知识:如何在数组中一次遍历就找出最大值出现的次数?
    • x == maxValcount++
    • x < maxVal:无视
    • x > maxVal:更新最大值,重新计数
      int maxVal = nums[0], count = 1;
      for(int i = 1; i < nums.size(); i++)
      {
      	if(nums[i] == maxVal)
      	{
      		count++;
      	}
      	else if(nums[i] > maxVal)
      	{
      		maxVal = nums[i];
      		count = 1;
      	}
      }
      
  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置元素为结尾的所有子序列中,最长递增子序列的个数
      • 本题状态标识还可以继续划分
        • len[i]:以i位置元素为结尾的所有子序列中,最长递增子序列的"长度"
        • count[i]:以i位置元素为结尾的所有子序列中,最长递增子序列的"个数"
    • 推导状态转移方程

      • ji前面的任一一个数
        请添加图片描述
    • 初始化:vector<int> len(n, 1), count(n, 1)

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

    • 确定返回值:前置知识部分用到的小贪心策略,见代码


3.代码实现

int findNumberOfLIS(vector<int>& nums) 
{
    int n = nums.size();
    vector<int> len(n, 1), count(n, 1);

    int retLen = 1, retCount = 1;
    for(int i = 1; i < n; i++)
    {
        for(int j = 0; j < i; j++)
        {
            if(nums[j] < nums[i])
            {
                if(len[j] + 1 == len[i])
                {
                    count[i] += count[j];
                }
                else if(len[j] + 1 > len[i])
                {
                    len[i] = len[j] + 1;
                    count[i] = count[j];
                }
            }
        }

        if(retLen == len[i])
        {
            retCount += count[i];
        }
        else if(retLen < len[i])
        {
            retLen = len[i];
            retCount = count[i];
        }
    }

    return retCount;
}

2.最长数对链

1.题目链接

  • 最长数对链

2.算法原理详解

  • 预处理:按照第一个元素排序
    • 此时问题就转化成了最长递增子序列了
    • 目的:保证当前位置不存在可以连在它后面的数对的后面的可能
  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置元素为结尾的所有子序列中,最长的数对链长度
    • 推导状态转移方程
      请添加图片描述

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

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

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


3.代码实现

int findLongestChain(vector<vector<int>>& pairs) 
{
    sort(pairs.begin(), pairs.end()); // 预处理

    int n = pairs.size();
    vector<int> dp(n, 1);

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

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

    return ret;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPT4o还没用上?落后一个月!

文章目录 一.Share官方网站&#xff1a;以一半的价格享受官网服务1.1 网址1.2 一些介绍和教学实战&#xff1a;1.3 主界面&#xff08;支持4o)&#xff1a;1.4 GPTS&#xff08;上千个工具箱任你选择&#xff09;&#xff1a;1.5 快速的文件数据分析&#xff08;以数学建模为例…

CPU/GPU/FPSGO,负载调试/设置命令开关

CPU/GPU/FPSGO&#xff0c;负载调试/设置命令开关 首先&#xff0c;进入&#xff1a; adb shell cat sys/kernel/ged/hal/gpu_utilization 查看GPU的负载情况。输出三个数字&#xff0c;第1个表示使用率&#xff0c;第3个表示空闲率。 echo 0 /sys/kernel/fpsgo/common/force…

Tableau创建数据提取

Tableau创建数据提取通过与原始数据集分离可有效减少总体数据量。以下通过示例-超市数据进行演示&#xff1a; 需求&#xff1a;提取华北及东北地区家具销售利润低于5000的数据 1&#xff09; 连接到数据并在“数据源”页面上设置数据源后&#xff0c;请在右上角选择“数据提…

Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明

Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明 目录 Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明 一、简单介绍 二、处理文本数据 三、用…

Java中的软引用,你了解吗?

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

关系数据库:关系运算

文章目录 关系运算并&#xff08;Union&#xff09;差&#xff08;Difference&#xff09;交&#xff08;Intersection&#xff09;笛卡尔积&#xff08;Extended Cartesian Product&#xff09;投影&#xff08;projection&#xff09;选择&#xff08;Selection&#xff09;除…

翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)

What a drag: Dragging a virtual file (IStream edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080319-00/?p23073 Raymond Chen 2008年03月19日 拖拽虚拟文件&#xff08;IStream 版本&#xff09; 上一次&#xff0c;我们看…

Scikit-Learn 基础教程

目录 &#x1f40b;Scikit-Learn 基础教程 &#x1f40b;Scikit-Learn 简介 &#x1f40b; 数据预处理 &#x1f988;数据集导入 &#x1f988;数据清洗 &#x1f988;特征选择 &#x1f988;特征标准化 &#x1f40b; 模型选择 &#x1f988;分类模型 &#x1f988;回…

【 0 基础 Docker 极速入门】镜像、容器、常用命令总结

Docker Images&#xff08;镜像&#xff09;生命周期 Docker 是一个用于创建、部署和运行应用容器的平台。为了更好地理解 Docker 的生命周期&#xff0c;以下是相关概念的介绍&#xff0c;并说明它们如何相互关联&#xff1a; Docker&#xff1a; Docker 是一个开源平台&#…

HTML旋转照片盒子

效果图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" content…

docker私有镜像仓库的搭建及认证

简介&#xff1a; docker私有镜像仓库的搭建及认证 前言 在生产上使用的 Docker 镜像可能包含我们的代码、配置信息等&#xff0c;不想被外部人员获取&#xff0c;只允许内 网的开发人员下载。 Docker 官方提供了一个叫做 registry 的镜像用于搭建本地私有仓库使用。在内部网…

C 基础 - 预处理命令和基本语法详解

#include <stdio.h> //预处理指令int main() //函数 {printf("Hello, World!"); //输出语句return 0; //返回语句 } 目录 一.预处理指令 1.#define #ifdef #ifndef #if #else #elif #endif 2.#inlcude a.新增一个文件 b.#include c.运行结果 d.扩…

Liunx中使用他人身份来执行命令或新建文件

前言 在一些情况下。我们想要借助某个用户的身份来执行命令或者新建文件&#xff0c; 比如某个用户的bash是 nologin 或者 false。 该怎么做呢&#xff1f;&#xff1f; 答&#xff1a;使用 sudo -u 即可。 例如&#xff1a; sudo -u ygz1 touch temp1.txt哈哈哈&#xff0…

【FPGA】Verilog语言从零到精通

接触fpga一段时间&#xff0c;也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇&#xff1a;Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架&#xff1a;模块的结构 类比&#xff1a;c语言的基础…

javascript DOM 属性详解:读取、修改、移除

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、读取…

Tesseract-OCR使用 jTessBoxEditor 进行训练及python调用

Python-tesseract 是 python 的光学字符识别 &#xff08;OCR&#xff09; 工具。 也就是说&#xff0c;它将识别并“读取”嵌入在图像中的文本。 1、下载安装 jTessBoxEditor和tesseract-ocr 我下载的是jTessBoxEditor-2.2.0版本的&#xff0c;里面自带tesseract-ocr。 两种…

哪款桌面便签软件安全好用?2024好用便签app推荐

桌面便签软件已经成为许多人日常生活和工作中不可或缺的工具&#xff0c;它们实用、灵活&#xff0c;能够帮助我们快速记录重要信息&#xff0c;提醒任务事项。随着科技的进步&#xff0c;市面上的便签软件层出不穷&#xff0c;功能也越发强大和实用。在众多的便签软件中&#…

Linux网络-使用Tcp协议进行网络通信并通过网络接口实现远端翻译

文章目录 Tcp协议Tcp协议常见API接口1. int socket(int domain, int type, int protocol);2. int bind(int socket, const struct sockaddr *address, socklen_t address_len);struct sockaddr 3. int listen(int socket, int backlog);4. int accept(int socket, struct socka…

[.NET开发者的福音]一个方便易用的在线.NET代码编辑工具.NET Fiddle

前言 今天给大家分享一个方便易用的.NET在线代码编辑工具&#xff0c;能够帮助.NET开发人员快速完成代码编写、测试和分享的需求&#xff08;.NET开发者的福音&#xff09;&#xff1a;.NET Fiddle。 .NET Fiddle介绍 我们可以不用再担心环境与庞大的IDE安装的问题&#xff0…

python实现——分类类型数据挖掘任务(图形识别分类任务)

分类类型数据挖掘任务 基于卷积神经网络&#xff08;CNN&#xff09;的岩石图像分类。有一岩石图片数据集&#xff0c;共300张岩石图片&#xff0c;图片尺寸224x224。岩石种类有砾岩&#xff08;Conglomerate&#xff09;、安山岩&#xff08;Andesite&#xff09;、花岗岩&am…