代码随想录算法训练营 ---第五十七天

今天是两道动态规划的经典题目。

第一题:


简介:

做了今天的题目我有了新的理解,我觉得过去我过于注重对于二维数组的理解,忽略了对dp数组i  和 j 的含义的理解。

动态规划五部曲:

1.确定dp数组的含义

    本题我们将i 和 j 看作是 s字符串两端,所以我们将其定义为 i和j 之间的子串是否为回文子串。

有人会问为何我们不像往常一样,将dp含义定义为问题所问,是因为我们定义dp数组是为了找出其中的递推关系。帮助我们更好的解题。那么此时我们是不是能找到一种递归关系,也就是判断一个子字符串(字符串的下表范围[i,j])是否回文,依赖于,子字符串(下表范围[i + 1, j - 1])) 是否是回文。所以为了明确这种递归关系,我们的dp数组是要定义成一位二维dp数组。布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。

2.确定dp数组的递推公式

    两种情况 s[i] == s[j]                          

  • 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串
  • 情况二:下标i 与 j相差为1,例如aa,也是回文子串
  • 情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。

                   s[i] != s[j]   dp[i][j] = false

3.确定数组的初始化

     都初始化为false

4.确定遍历顺序

   怎么遍历要看我们的递推公式我们呢可以看出是从左下往右上推导 所以我们从上到下,从左到右遍历

5.打印数组

代码实现:

    int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result = 0;for (int i = s.size() - 1; i >= 0; i--) {  // 注意遍历顺序for (int j = i; j < s.size(); j++) {if (s[i] == s[j]) {if (j - i <= 1) { // 情况一 和 情况二result++;dp[i][j] = true;} else if (dp[i + 1][j - 1]) { // 情况三result++;dp[i][j] = true;}}}}return result;}

第二题:

简介:

本题相较于上题有所不同,首先上题是连续的子串,本题可以是不连续的。但是思路相差不大,都是将dp模型i 和 j 看作是 s字符串两端,但是我们将其定义为 i和j 之间的子串的长度。

动态规划五部曲:

1.确定dp数组的含义

   将dp模型i 和 j 看作是 s字符串两端,但是我们将其定义为 i和j 之间的子串的长度

2.确定dp数组的递推公式

    两种情况: s[i]== s[j]   相等的话我们看 i+1 和 j-1 之间的子串的长度加2 就是当前的长度

                                           dp[i][j] = dp[i+1][j-1]+2 

                       s[i]!= s[j]            

3.确定数组的初始化

    因为递推公式原因 我们可以看出 我们无法推到 i 和 j 相同的情况 所以我们将 i 和 j相同的情况初始化为1 因为 一个字符 子串长度为1.

其他初始化为零

4.确定遍历顺序

  

5.打印数组

代码实现: 

    int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));for(int i=0;i<s.size();i++)dp[i][i] = 1;for(int i=s.size()-1;i>=0;i--){for(int j=i+1;j<s.size();j++){if(s[i] == s[j]){dp[i][j] = dp[i+1][j-1]+2;}else{dp[i][j] = max(dp[i+1][j],dp[i][j-1]);}}}return dp[0][s.size()-1];}

总结: 

动态规划有点折磨,有点抽象。一定要多刷几遍,多理解。继续加油!

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

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

相关文章

git: 修改commit的comment

1. 修改最后一次commit的comment git commit --amend输入i进入编辑模式&#xff0c;修改后&#xff0c;Esc退出编辑模式&#xff0c;输入:wq!保存并退出 2. 修改历史的某个commit的comment 在修改前&#xff0c;先保证没有未提交的更改&#xff0c;如果有&#xff0c;需要co…

什么是https加密协议?

什么是https加密协议 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种用于在计算机网络上安全传输数据的通信协议。它是HTTP的安全版本&#xff0c;通过使用加密和身份验证机制来保护数据传输的安全性和完整性。HTTPS使用SSL&#xff08;Secure Socke…

cuda驱动安装

cuda驱动安装失败 You do not appear to have libc header files installed on your system. Please install your distributions libc development package. ok,我来安装libc sudo apt-get install libc6-dev build-essential 失败 libc6-dev : 依赖: libc6 ( 2…

vue使用vue-router路由控件

vue-router是官方路由控件&#xff0c;但官网竟然没有该路由的使用方法啊&#xff0c;只有单页面的简单示例&#xff0c;引用的是网页js模式&#xff0c;不是vue的引用模式啊。 {"name": "vue01","private": true,"version": "0…

艾泊宇产品战略:低价的战争:阿里、京东、拼多多的终局推演

导读 这个双十一&#xff0c;是一场三大巨头的低价战争。 而如今双十二快到了&#xff0c;他们的低价战争还会继续吗&#xff1f; 阿里要做“全网最低价”&#xff0c;京东要做”真便宜 闭眼买“&#xff0c;拼多多则是“天天11.11&#xff0c;天天真低价” 阿里、京东作为…

面试操作系统八股文五问五答第一期

面试操作系统八股文五问五答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.死锁产生的条件 1.互斥条件&#xff0c;即当资源被一个线程使用&#xff08;…

流畅的python--小技巧总结

对于百万级以上数据的读写效率优化 在Python中&#xff0c;我们可以通过array模块来方便地创建和操作数组&#xff0c;array模块提供了性能优异的数组操作方法&#xff0c;可以使我们的代码更加高效。同时&#xff0c;Python也提供了读写二进制文件和普通文本文件的方法&#…

Rename--CAM在checkpoint恢复上的流程与优势

参考自&#xff1a;计算机体系结构-寄存器重命名 - 知乎 (zhihu.com) 这里的重点在红色部分描述上&#xff0c;也是容易想不通的地方&#xff1b; 在SRAM方法中要恢复映射表状态&#xff0c;需要事先把分支指令来临时刻的映射表全份拷贝下来&#xff0c;然后在恢复时把备份复制…

Linux 环境下,jdbc连接mysql问题

1. 下载MySQL的JDBC驱动&#xff1a; 从MySQL官网下载最新的MySQL Connector/J&#xff0c;并将其解压到某个目录&#xff0c;比如/usr/local/mysql/。 2. 将JDBC驱动添加到类路径&#xff1a; 将JDBC驱动添加到类路径&#xff0c;可以使用以下命令&#xff1a; export CLA…

AMEYA360分析兆易创新GD32A490系列车规级MCU

兆易创新GigaDevice今日宣布&#xff0c;正式推出全新GD32A490系列高性能车规级MCU&#xff0c;以高主频、大容量、高集成和高可靠等优势特性紧贴汽车电子开发需求&#xff0c;适用于车窗、雨刷、智能车锁、电动座椅等BCM车身控制系统&#xff0c;以及仪表盘、娱乐影音、中控导…

每日OJ题_算法_双指针②_力扣1089. 复写零

目录 力扣1089. 复写零 解析代码 力扣1089. 复写零 1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 难度 简单 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在…

4.3 容器编排工具的比较与选择

容器编排工具的比较与选择 Kubernetes 介绍 Kubernetes&#xff0c;是目前最流行和功能强大的容器编排平台之一。强调 Kubernetes 的自动化、高可用、扩展性和灵活的特点。讨论 Kubernetes 的主要组件和架构&#xff0c;如 Master 节点、Node 节点、控制器和调度器等。分析 Ku…

智慧景区(园区)数字孪生可视化GIS解决方案

随着技术的日新月异&#xff0c;景区日常管理及运营中使用到的智慧化工具越来越丰富&#xff0c;智慧化硬件设备也越来越多&#xff0c;而其中各个管理系统往往又是相互独立&#xff0c;形成一个个数据孤岛。智慧景区管理平台就是将各个孤岛中的数据及功能汇集起来&#xff0c;…

政采云基于 Dubbo 的混合云数据跨网实践

作者&#xff1a;王晓彬&#xff0c;政采云资深开发工程师 项目背景 政采云的业务是为政府提供的购物网站&#xff0c;类似于淘宝。政府采购会在政采云上做企业采购、政府采购的业务。 云岛中的“云”是指我们的云平台&#xff0c;云平台是我们公司自己部署的一套购物网站&a…

【计算机网络漫谈】OSI七层模型与TCP/IP四层(参考)模型

一、七层&#xff1f;四层&#xff1f; 1.为什么需要协议&#xff1f;2.OSI七层模型是干什么的&#xff1f;3.TCP/IP四层&#xff08;参考&#xff09;模型4.TCP/IP&#xff08;参考&#xff09;模型与OSI七层模型有什么异同&#xff1f; 二、自底向上的网络分层 1. 物理层2…

阻止事件e.stopPropagation()和e.preventDefault的区别

e.stopPropagation() 和 e.preventDefault() 是两个在事件处理中常用的方法&#xff0c;它们有不同的作用&#xff1a; e.stopPropagation(): 作用&#xff1a;阻止事件在DOM中的进一步传播&#xff0c;即停止事件冒泡。使用场景&#xff1a;当你希望阻止一个事件从目标元素向上…

防火墙 iptables的使用

目录 什么是防火墙 原理 代理 防火墙的工具 4表5列 五链&#xff1a;控制流量的时机 四个表&#xff1a;如何控制流量 ​编辑 iptables 软件 格式 选项 跳转 查iptables 的规则 添加规则 A I 删除规则 清空规则 替换规则 R 修改默认规则&#xff08;默…

校园外卖小程序源码系统 附带完整的搭建教程

随着大学生消费水平的提高&#xff0c;对于外卖服务的需求也在不断增加。很多学生都面临着课业繁重、时间紧张等问题&#xff0c;无法亲自到餐厅就餐。因此&#xff0c;开发一款适合校园外卖市场的应用软件&#xff0c;将为广大学生提供极大的便利。 以下是部分代码示例&#…

vector例题:hdu4841圆桌问题

解题代码来源于一本书&#xff1a;《算法竞赛&#xff1a;入门到进阶》 圆桌上围坐着2n个人。其中n个人是好人&#xff0c;另外n个人是坏人。如果从第一个人开始数数&#xff0c;数到第m个人&#xff0c;则立即处死该人&#xff1b;然后从被处死的人之后开始数数&#xff0c;再…

Python Numpy学习(1)

python: np.pad() 函数的用法 np.einsum(爱因斯坦求和约定) python编程之np.isnan()的用法 Python_Numpy库中各种矩阵基本运算 numpy基本加减和取行操作 numpy的加减乘除运算 NumPy 算术函数 TypeError: can’t convert cuda:0 device type tensor to numpy. Use Tenso…