刷题之动态规划-子序列

前言

大家好,我是jiantaoyab,开始刷动态规划的子序列类型相关的题目,子序列元素的相对位置和原序列的相对位置是一样的

动态规划5个步骤

  1. 状态表示 :dp数组中每一个下标对应值的含义是什么>dp[i]表示什么
  2. 状态转移方程: dp[i] 等于什么
  3. 1 和 2 是动态规划的核心步骤,第三步是初始化,保证填表的时候不越界
  4. 填表顺序:为了保证填写当前状态的时候,所需要的状态已经计算过
  5. 返回值

最长递增子序列

image-20240403095425098

题目分析

image-20240403105502701

代码

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


摆动序列

image-20240404090127835

代码

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
      int n = nums.size();
      vector<int> f(n, 1); 
      vector<int> g(n, 1);
      int ret = 1;
      for(int i = 1; i < n; i++)
      {
        for(int j = 0; j < i; j++)
        {
          if(nums[j] < nums[i])
          //递增
          f[i] = max(f[i],  g[j] + 1); 
          else if(nums[j] > nums[i])
          //递减 
          g[i] = max(g[i],  f[j] + 1);
        }   
        ret = max(f[i], g[i]);
      }
      return ret ;

    }
};

最长递增子序列的个数

image-20240404094248815

题目分析

image-20240404102615870

代码

class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        int n = nums.size();
        vector<int> len(n, 1);
        vector<int> count(n, 1);
        int ret_len = 1, ret_count = 1;
        for(int i = 1; i < n; i++)
        {
          for(int k = 0; k < i; k++)
          {
            if(nums[k] < nums[i]) 
            {
              if(len[k] + 1 == len[i]) count[i] += count[k];
              else if(len[k] + 1 > len[i])
              {
                len[i] = len[k] + 1 ; count[i] = count[k];
              }
              
            }                 
          }
          //更新返回值
          if(ret_len == len[i]) ret_count += count[i];
          else if(ret_len < len[i]) ret_len = len[i], ret_count = count[i];
         
        }
        return  ret_count;
        
    }
};

最长数对链

image-20240404103433761

题目分析

dp[i]: 表示以i位置为结尾的最长数对链的长度

在(0,i-1)中取一个j,是数对链的话得满足pairs[j] [1] < pairs[i] [0]

代码

class Solution {
public:
    int findLongestChain(vector<vector<int>>& pairs) {
        int m = pairs.size();
        vector<int> dp (m, 1);
        sort(pairs.begin(), pairs.end());

        int ret = 1;
        for(int i = 1; i < m; 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;
    }
};

最长定差子序列

image-20240405082954751

题目分析

image-20240405090140474

代码

class Solution {
public:
    int longestSubsequence(vector<int>& arr, int difference) {
        int n  = arr.size();
        unordered_map<int, int> hash; //<arr[i], dp[i]>
        int ret = 1;
        //初始化
        hash[arr[0]] = 1;
        for(int i = 1; i < n; i++)
        {
          hash[arr[i]] = hash[arr[i] - difference] + 1;
          ret = max(ret, hash[arr[i]]);
        }
        return ret;
    }
};

最长的斐波那契子序列的长度

image-20240406175144571

题目分析

image-20240406185244342

代码

class Solution {
public:
    int lenLongestFibSubseq(vector<int>& arr) {
      
        int n = arr.size();
        vector<vector<int>> dp(n, vector<int>(n, 2));
        unordered_map<int, int> hash;
        //将arr中的值和下标绑定起来
        for(int i = 0; i < n; i++) hash[arr[i]] = i;
        int ret = 2;
        for(int j = 2; j < n; j++) //固定最后一个位置
        {
          for(int i = 1; i < j; i++) //固定倒数第二个位置
          {
            int x = arr[j] - arr[i];
            if(hash.count(x) && x < arr[i]) 
            {
              dp[i][j] = dp[hash[x]] [i]+ 1;
              ret = max(ret, dp[i][j]);
            }
          }
          
        }
        return ret < 3 ?  0  : ret;


    }
};

最长等差数列

image-20240407082524850

题目分析

image-20240407091840789

代码

class Solution {
public:
    int longestArithSeqLength(vector<int>& nums) {
        int n = nums.size();
        unordered_map<int, int> hash; //放nums元素对应的下标
        hash[nums[0]] = 0;
        int ret = 2;
        vector<vector<int>> dp(n,  vector<int>(n, 2));
        for(int i = 1; i < n; i++) //固定倒数第2个数
        {
          for(int j = i + 1; j < n; j++) //依次枚举倒数第一个数
          {
              int x = 2 * nums[i]  - nums[j];
              if(hash.count(x)) dp[i][j] = dp[hash[x]][i] + 1;
              ret = max(ret,  dp[i][j]);
          }
          hash[nums[i]] = i;
        }
        return ret;
    }
};

等差数列划分 II - 子序列

image-20240407092146451

题目分析

image-20240407100137814

代码

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& nums) {
      int n = nums.size();
      unordered_map<long long, vector<int>> hash; //存放nums元素对应的下标
      for(int i = 0; i < n; i++) hash[nums[i]].push_back(i); //每个元素的下标可能有多个

      vector<vector<int>> dp(n, vector<int>(n));
      int ret = 0;
      for(int j = 2; j < n; j++) //固定最后一个位置
      {
        for(int i = 1; i < j; i++) //依次遍历倒数第二个位置
        {
          long long x = (long long)2 * nums[i] - nums[j];
          if(hash.count(x)) 
          {
            //提取出nums[i]的下标
            for(auto k : hash[x])
            {
              if(k < i) dp[i][j] += dp[k][i] + 1;
            }
          }
          ret += dp[i][j];
         
        }
      }
      return ret;
    }
};

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

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

相关文章

[工具使用]绕过付费-适用于谷歌/火狐/Edge浏览器

绕过付费-适用于谷歌/火狐/Edge浏览器 bypass-paywalls是一款浏览器插件&#xff0c;可以帮助绕过选定网站的付费 链接&#xff1a;https://github.com/iamadamdev/bypass-paywalls-chrome 一、谷歌/Edge浏览器安装说明&#xff08;支持自定义网站&#xff09; 1、从Github下…

Xinstall助力提升用户体验:一键打开App用户页面

在移动互联网时代&#xff0c;App已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着App数量的激增&#xff0c;如何让用户更便捷地打开和使用App&#xff0c;提升用户体验&#xff0c;成为了开发者和广告主们亟待解决的问题。此时&#xff0c;Xinstall作为国内专业…

golang使用sse事件流调用AI大模型

目录 前言第一步 解决没有官方SDK的痛第二步 实现流式传输什么是SSE,SSE和WebSocket的区别基于gin实现SSE服务器gin接收AI大模型数据流响应1. 前端携带自定义问题请求后端接口2. 后端接受请求解析问题&#xff0c;然后创建stream对象3. 构建请求参数&#xff0c;调用创建数据流…

《CSS 知识点》仅在文本有省略号时添加 tip 信息

html <div ref"btns" class"btns"><div class"btn" >这是一段很短的文本.</div><div class"btn" >这是一段很短的文本.</div><div class"btn" >这是一段很长的文本.有省略号和tip.<…

ubuntu或类Debian获取某些包的离线版本-包括依赖(还有一些意想不到的用途,哈哈)

前言 偶尔能碰到很特殊的情况。网址白名单&#xff0c;纯内网&#xff0c;超多依赖及一些很难描述的场景。 比如一些少见的发行版缺少某些包。这时候可以找一台类似的系统环境来下载离线包及 其依赖包&#xff0c;然后转移到内网进行安装。如果是网址白名单&#xff0c;或者纯内…

AI的力量感受(附网址)

输入 科技感的 二维码&#xff0c;生成如下&#xff0c;还是可以的 输入金属感 的芯片&#xff0c;效果就很好了 金属感 打印机&#xff0c;细节丰富&#xff0c;丁达尔效应 就有点跑题了 金属感 扫码仪 还有点像 3D 封装长这样&#xff0c;跑题比较严重 总之&#xff0c;AI还…

yolov8安全帽检测项目开发(python开发,带有训练模型,可以重新训练,并有Pyqt5界面可视化)

不需要程序&#xff0c;只需要数据集的&#xff0c;想自己搭建模型训练的&#xff0c;可以免费下载&#xff08;积分已经设置为0&#xff09;&#xff1a;https://download.csdn.net/download/qq_40840797/89100918 1.项目介绍&#xff1a;&#xff08;视频运行链接&#xff1…

KMP刷leetcode速通

前言 KMP真厉害&#xff0c;刷题刷到 28.找出字符串中第一个匹配项的下标 和 1668.最大重复子字符串 next 数组用来匹配不上时&#xff0c;前缀 j j j 可以快速回退到 n e x t [ j − 1 ] next[j-1] next[j−1] 的位置。 void getNext(vector<int>& next, const…

我院组织《医务人员如何构建良好人际关系》主题讲座

为进一步规范医务人员行为&#xff0c;熟练运用沟通技巧&#xff0c;掌握沟通技能&#xff0c;更好的为患者服务&#xff0c;提高工作效率。3月7日&#xff0c;北京精诚博爱医院护理部特别邀请了原海军总医院心理科郭勇教授&#xff0c;为临床医务工作者作了《心理健康教育之医…

文本溢出隐藏用小点表示(多行溢出,单行溢出)

一、效果 文本溢出隐藏&#xff0c;用小点表示。 单行溢出隐藏&#xff1a; 规定第几行溢出隐藏&#xff1a; 二、代码 单行&#xff1a; <p class"p1">gdgFIAHfuiasdhgiubvsDIUGHSFUIGHGDFUIGUISDFHVUIJKDFDFUIKGJKGJKG</p> width: 200px; height:…

Docker 安装RabbitMQ以及使用客户端图形化界面

目录 一、点击进入docker 镜像仓库 1.1 直接在官网里 搜索 rabbitmq 1.2 在标签里 直接搜索3.10-management 因为这个标签包含用户操作界面 二、启动docker 2.1 首先拉取镜像&#xff1a; 2.2 Docker运行&#xff0c;并设置开机自启动 三、访问用户操作界面 一、点击进入…

项目经理要懂技术吗?

项目经理就好比乐团的指挥&#xff0c;指挥可能不需要精通每种乐器&#xff0c;但是指挥应该具备相应的音乐知识&#xff0c;对每种乐器有着自己的理解和经验&#xff0c;并且能够与乐队每个人进行专业上的沟通。而项目的专业性越强&#xff0c;对于项目经理的技术水平要求就越…

码住财务记账软件大揭秘!财务记账软件推荐指南

财务管理软件在现代企业管理中发挥着至关重要的作用。本篇文章将为大家介绍10款财务管理软件&#xff1a;Zoho Books、畅捷通T、速达财务软件、金税管家、QuickFile、Kashoo、AccountingSuite、Manager、金蝶KIS、Oracle NetSuite。 一、Zoho Books Zoho Books以其强大的功能…

Git-LFS 远程命令执行漏洞 CVE-2020-27955 漏洞复现

今天遇到了一个比较有意思的洞&#xff0c;复现一下下.......... 漏洞描述 Git LFS 是 Github 开发的一个 Git 的扩展&#xff0c;用于实现 Git 对大文件的支持 一些受影响的产品包括Git&#xff0c;GitHub CLI&#xff0c;GitHub Desktop&#xff0c;Visual Studio&#xff0…

Shoplazza闪耀Shoptalk 2024,新零售创新解决方案引领行业新篇章!

在近期举办的全球零售业瞩目盛事——Shoptalk 2024大会上,全球*的零售技术平台-店匠科技(Shoplazza)以其*的创新实力与前瞻的技术理念,成功吸引了与会者的广泛关注。此次盛会于3月17日至20日在拉斯维加斯曼德勒湾隆重举行,汇聚了逾万名行业精英。在这场零售业的盛大聚会上,Shop…

每日一题 第八十二期 CodeTON Round 8 (Div. 1 + Div. 2, Rated, Prizes!)

C1. Bessie’s Birthday Cake (Easy Version) time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input output: standard output Proof Geometric Construction Can Solve All Love Affairs - manbo-p ⠀ This is the easy versio…

深度学习理论基础(四)Parser命令行参数模块

学习目录&#xff1a; 深度学习理论基础&#xff08;一&#xff09;Python及Torch基础篇 深度学习理论基础&#xff08;二&#xff09;深度神经网络DNN 深度学习理论基础&#xff08;三&#xff09;封装数据集及手写数字识别 深度学习理论基础&#xff08;四&#xff09;Parse…

【深入理解Java IO流0x05】Java缓冲流:为提高IO效率而生

1. 引言 我们都知道&#xff0c;内存与硬盘的交互是比较耗时的&#xff0c;因此适当得减少IO的操作次数&#xff0c;能提升整体的效率。 Java 的缓冲流是对字节流和字符流的一种封装&#xff08;装饰器模式&#xff0c;关于IO流中的一些设计模式&#xff0c;后续会再出博客来讲…

(css)el-tag标签,el-select多选框,el-cascader级联选框自定义样式

(css)el-tag标签&#xff0c;el-select多选框&#xff0c;el-cascader级联选框自定义样式 css: :root {--button-color: #065de0; }// 标签 .tagNew {margin-right: 20px;border-radius: 20px; }.el-tag.el-tag--info {background-color: var(--button-color);border-color: v…

【THM】Metasploit: Exploitation(利用)-初级渗透测试

介绍 在这个房间里,我们将学习如何使用Metasploit进行漏洞扫描和利用。我们还将介绍数据库功能如何使管理更广泛范围的渗透测试活动变得更容易。最后,我们将研究使用msfvenom生成有效负载以及如何在大多数目标平台上启动Meterpreter会话。 更具体地说,我们将讨论的主题是:…