刷题之动态规划-两个数组

news2024/11/26 9:57:01

前言

大家好,我是jiantaoyab,开始刷动态规划的两个数组类型相关的题目

动态规划5个步骤

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

最长公共子序列

image-20240410090952909

题目分析

image-20240410095204308

代码

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
      int m = text1.size(), n = text2.size();
      //增加一行和一列 dp[i - 1][j - 1]的时候不会越界
      vector<vector<int>> dp(m + 1, vector<int>(n + 1));

      //初始化
      text1 = " " + text1, text2 = " " + text2;
      for(int i = 1; i <= m; i++)
      {
        for(int j = 1; j <= n; j++)
        { 
          if(text1[i] == text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;
          else
          dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
        }
      }

      return dp[m][n];
    }
}; 

最长重复子数组

image-20240413085655636

代码

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

不相交的线

image-20240410100519921

代码

这道题目和上一道题目很像,不过是在数组中最长公共的子序列

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size(), n = nums2.size();
        //避免dp[i - 1][j - 1]越界
        vector<vector<int>> dp (m + 1, vector<int>(n + 1));
        for(int i = 1; i <= m; i++)
        {
          for(int j = 1; j <= n; j++)
          {
            if(nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
            else
            {
              dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
          }
        }
        return dp[m][n];
    }
};

不同的子序列

image-20240411095151339

题目分析

image-20240411102621891

代码

class Solution {
public:
    int numDistinct(string s, string t) {
        int m = t.size(), n = s.size();

        vector<vector<int>> dp(m + 1, vector<int>(n + 1));

        for(int j = 0; j <= n; j++) dp[0][j] = 1; //初始化

        for(int i = 1; i <= m; i++)
        {
          for(int j = 1; j <= n; j++)
          {
            dp[i][j] += dp[i][j - 1];
            if(t[i - 1] == s[j - 1]) dp[i][j] += dp[i - 1][j - 1] % 10000000007; 
                            
          }
        }
        return dp[m][n];
    }
};

通配符匹配

image-20240411105113954

题目分析

image-20240411114621577

初始化

image-20240412083947801

代码

class Solution {
public:
    bool isMatch(string s, string p) {
      int m = s.size(), n = p.size();
      vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
      s= " " + s, p = " " + p;
      //初始化
      dp[0][0] = true; //空串匹配空串
      for(int j = 1; j <= n; j++) 
      {
        if(p[j] == '*') dp[0][j] = true;
        else break;
      }
      for(int i = 1; i <= m; i++)
      {
        for(int j = 1; j <= n; j++)
        {
          if(p[j] == s[i] && dp[i -1][j - 1] == true) dp[i][j] = true;
          else if(p[j] == '?' &&  dp[i - 1][j- 1] == true) dp[i][j] = true;
          else if(p[j] == '*') dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
       
        }
      }
      return dp[m][n];

    }
};

正则表达式匹配

image-20240412080453240

题目分析

这里的*是根据前面的字符来匹配的,不能单独使用。

image-20240412093228543

image-20240412093240354

代码

class Solution {
public:
    bool isMatch(string s, string p) {
      int m = s.size(), n = p.size();
      vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
      //初始化
      dp[0][0] = true;
      s = ' ' + s , p = ' ' + p;
      for(int j = 2; j <= n; j += 2)
      {
        if(p[j] == '*') dp[0][j] = true;
        else break;
      }

      for(int i = 1; i <= m; i++)
      {
        for(int j = 1; j <= n; j++)
        {
          if( p[j] == '*')
           dp[i][j] = dp[i][j - 2] || (p[j - 1] == '.' || p[j - 1] == s[i]) && dp[i -1][j];    
          else         
           dp[i][j] = (s[i] == p[j] || p[j] == '.') && dp[i - 1][j - 1] ;

     
        }
      }
      return dp[m][n];
    }
};

交错字符串

image-20240411134821878

题目分析

image-20240411141632827

代码

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
      int m = s1.size(), n = s2.size();
      if(n + m != s3.size()) return false;
       vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
      s1 = " " + s1, s2 = " " + s2, s3 = " " + s3;
      //初始化
      dp[0][0] = true;
      for(int i = 1; i <= n; i++) 
        if(s2[i] == s3[i]) dp[0][i] = true;
        else break;
      for(int j = 1; j <= m; j++) 
        if(s1[j] == s3[j]) dp[j][0] = true;
        else break;
      
      for(int i = 1; i <= m; i++)
      {
        for(int j = 1; j <= n; j++)
        {
          if(s1[i] == s3[i + j] && dp[i - 1][j]) dp[i][j] = true;
          else if(s2[j] == s3[i + j] && dp[i][j - 1]) dp[i][j] = true;
        }
      }
      return dp[m][n];
    }
};

两个字符串的最小ASCII删除和

image-20240412093337675

代码

class Solution {
public:
    int minimumDeleteSum(string s1, string s2) {
      int m = s1.size(), n = s2.size();
      //dp[i][j] 表示s1[0, i]和s2[0, j]公共子串ascii值最大
      vector<vector<int>> dp (m + 1, vector<int>(n + 1));
      
      for(int i = 1; i <= m; i++)
      {
        for(int j = 1; j <= n; j++)
        {
          dp[i][j]  = max(dp[i][j - 1], dp[i - 1][j]);
          if(s1[i - 1] == s2[j - 1]) 
          dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + s1[i - 1]);       
        }
      } 
      int sum = 0;
      for(auto c : s1) sum += c;
      for(auto c : s2) sum += c;
      return sum - dp[m][n] - dp[m][n];
    }
};

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

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

相关文章

APP下载页前端自适应HTML源码

源码介绍 APP下载页前端自适应HTML源码&#xff0c;可以作为自己的软件介绍页或者app下载页&#xff0c;喜欢的朋友可以拿去研究 效果预览 HTML源码下载 https://www.qqmu.com/3026.html

SpringCloud集成SkyWalking链路追踪并收集日志2

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

第6章 6.1.1 文本格式化 sprintf函数(MATLAB入门课程)

sprintf函数源自 C 语言标准库中的同名函数&#xff0c;这个函数在 C 语言中用于创建格式化的字符串&#xff0c;且使用频率非常高。作为一门高级编程语言&#xff0c;MATLAB借鉴了 C 语言和其他编程语言中的许多特性和命名惯例。在MATLAB中&#xff0c;sprintf函数主要有两种用…

使用unicloud-map 无法展示poi的天坑

天坑&#xff01;天坑&#xff01;天坑 使用unicloud-map的天坑 202404121722&#xff0c;昨天晚上发现uni-admin中导入了unicloud-map管理端之后在chrome浏览器由于地图定位失败&#xff0c;一直没有办法新增poi,不过后面发现safari浏览器是可以定位出来的&#xff0c;所以今…

大厂Java笔试题之找出组成一个偶数最大的两个素数

题目&#xff1a;找出组成一个大于2的偶数最接近的两个素数。 比如 输入20 输出7 13 注意&#xff1a;这里有一个理论&#xff0c;任意一个大于2的偶数&#xff0c;都能找到2个素数&#xff0c;相加等于这个偶数。 public class Demo10 {public static void main(String[] ar…

python入门(一)配置环境和选择IDE

Python&#xff0c;作为一种简洁易懂的编程语言&#xff0c;近年来在全球范围内受到了广泛的关注和追捧。它不仅语法简单明了&#xff0c;易于上手&#xff0c;而且拥有强大的第三方库和广泛的应用领域。从数据分析、机器学习到Web开发&#xff0c;Python都能发挥出色的性能&am…

Python 全栈体系【四阶】(三十)

第五章 深度学习 四、Tensorflow 8. 模型保存与加载 8.1 什么是模型保存与加载 模型训练可能是一个很长的过程&#xff0c;如果每次执行预测之前都重新训练&#xff0c;会非常耗时&#xff0c;所以几乎所有人工智能框架都提供了模型保存与加载功能&#xff0c;使得模型训练完…

2024年MathorCup数模竞赛B题问题一二三+部分代码分享

inputFolderPath E:\oracle\images\; outputFolderPath E:\oracle\process\; % 获取文件夹中所有图片的文件列表 imageFiles dir(fullfile(inputFolderPath, *.jpg)); % 设置colorbar范围阈值 threshold 120; % 遍历每个图片文件 for i 1:length(imageFiles) % 读…

【NLP练习】调用Gensim库训练Word2Vec模型

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、准备工作 1.安装Gensim库 使用pip安装&#xff1a; !pip install gensim2. 对原始语料分词 选择《人民的民义》的小说原文作为语料&#xff0c;先采用…

12.4.1 实验1:配置CDP

12.4.1 实验1&#xff1a;配置CDP 1、实验目的 通过本实验可以掌握: CDP特征。CDP配置和调试方法。通过CDP查看设备直连邻居信息的方法。 2、实验拓扑 配置CDP的实验拓扑如上图所示。 3、实验步骤 &#xff08;1&#xff09;配置路由器R1 R1(config)#interface serial 0…

js解密心得,记录一次抓包vue解密过程

背景 有个抓包结果被加密了 1、寻找入口&#xff0c;打断点 先正常请求一次&#xff0c;找到需要的请求接口。 寻找入口&#xff0c;需要重点关注几个关键字&#xff1a;new Promise 、new XMLHttpRequest、onreadystatechange、.interceptors.response.use、.interceptors.r…

SpringBoot与MyBatisPlus的依赖版本冲突问题

记录使用SpringBoot和MyBatisPlus时遇到的版本冲突问题解决。 java版本&#xff1a;jdk17 废话&#xff1a;&#xff09;目前在IDEA中使用Spring官方的脚手架最低jdk版本竟然是jdk17了。 当使用SpringBoot3.0版本(3.2.4)&#xff0c;配合使用MP3.5.2版本时报错&#xff1a; Er…

MongoDB的安装和使用

1.MongoDB 安装 1.1 基于Docker安装 docker run --restartalways -d --name mongo -v /opt/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6 1.2 客户端工具使用 MongoDB Compass | MongoDB 2.MongoDB 使用 2.1 引用依赖包 <dependency><groupId>org.sprin…

基于单片机的智能居家火灾报警系统

摘要:采用STC15L2K32单片机设计了一种智能火灾报警系统,它是控制中心与多个不同功能的探测模块构成,实现了一个中心、多点辐射的火灾检测和报警功能。 关键词:智能居家,火灾报警系统,单片机,模块化设计。 0 引言 近些年电子技术、计算机技术为火灾报警系统和灭火系统在…

element-ui的年份范围选择器,选择的年份需等于或小于当前年份,选择的年份范围必须在三年之内

写在前面 日期限制处理&#xff08;禁用&#xff09;&#xff0c;下面我以我这边的需求为例&#xff0c; 选择的年份需等于或小于当前年份 选择的年份范围必须在三年之内 1.限制起始日期小于截止日期 1&#xff09;根据用户选中的开始日期&#xff0c;置灰不可选的日期范围&…

地理空间分析中的深度学习应用

深度学习与地理信息系统 (GIS) 的结合彻底改变了地理空间分析和遥感的格局。这种结合将遥感和地理空间分析领域带到了全球研究人员和科学家的前沿。 深度学习是机器学习的一个复杂子集&#xff08;更多关于机器学习的内容&#xff0c;请参阅我的其他文章&#xff09;&#xff0…

Harmony鸿蒙南向外设驱动开发-Camera

功能简介 OpenHarmony相机驱动框架模型对上实现相机HDI&#xff08;Hardware Device Interface&#xff09;接口&#xff0c;对下实现相机Pipeline模型&#xff0c;管理相机各个硬件设备。 该驱动框架模型内部分为三层&#xff0c;依次为HDI实现层、框架层和设备适配层。各层基…

【c 语言】结构体的定义格式及变量初始化

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅳ)其他配置项

vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#xff09;配置项文档 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;搜索及数据获取配…

可视化大屏的应用(13):在智慧校园的九项应用

实时数据展示 可视化大屏可以将各类实时数据以图表、图形等形式展示出来&#xff0c;如学生人数、教职工分布、教室使用情况、图书馆座位情况等。通过直观的数据展示&#xff0c;帮助学校管理人员和教职工了解校园的运行状况&#xff0c;及时做出决策和调整。 信息发布与通知 …