当前位置: 首页 > article >正文

代码随想录算法训练营 Day40 | 动态规划 part13

647. 回文子串给你一个字符串s请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。class Solution { public: int countSubstrings(string s) { int n s.size(); vectorvectorbool dp(n, vectorbool(n, false)); int res 0; // 【细节1完美的下三角遍历】 // 必须从下往上i从n-1开始因为 dp[i][j] 依赖它左下方的 dp[i1][j-1] // 内层 j 从 i 开始直接舍弃了 j i 的无意义右上角区域 for(int i n - 1; i 0; i--) { for(int j i; j n; j) { if(s[i] s[j]) { // 【细节2优雅的边界合并】 // j - i 1 这个神级条件把两种情况完美合二为一 // 1. j i (长度为1的单字符本身就是回文) // 2. j - i 1 (长度为2的相邻字符如aa只要相等就是回文) // 这两种情况都不需要去越界访问 dp[i1][j-1] if(j - i 1) { res; dp[i][j] true; } else if(dp[i1][j-1]) { // 长度大于2依赖内部子串是否为回文 res; dp[i][j] true; } } // 如果 s[i] ! s[j]dp[i][j] 默认就是 false根本不用写 else } } return res; } };总结1. 单串区间 DP从这道题开始不再是两个字符串比来比去而是在一个字符串内部截取区间[i, j]研究这个区间的性质。状态定义dp[i][j]代表闭区间[i, j]内的子串是否为回文串bool类型。目标函数统计矩阵中true的个数。2. 状态转移方程判断[i, j]是不是回文首要条件是两头字符必须相等s[i] s[j]。相等之后按区间长度分三种情况长度为 1i j单字符必然是回文。长度为 2j - i 1如aa两头相等就是回文。长度 2j - i 1如abca两头相等还不够必须看抠掉两头后的内部区间dp[i1][j-1]是不是回文。3. 遍历顺序这是区间 DP 和普通二维 DP 的最大区别。普通 DP如编辑距离从左上往右下遍历。区间 DP因为dp[i][j]依赖它正左下方的dp[i1][j-1]所以必须保证算[i, j]的时候它下面的行已经算完了。铁律外层i倒序遍历从下往上内层j正序遍历从左往右且j i跳过无意义右上角。516. 最长回文子序列给你一个字符串s找出其中最长的回文子序列并返回该序列的长度。子序列定义为不改变剩余字符顺序的情况下删除某些字符或者不删除任何字符形成的一个序列。class Solution { public: int longestPalindromeSubseq(string s) { int n s.size(); vectorvectorint dp(n, vectorint(n, 0)); // 【细节1精准的初始化】 // 上一题求bool默认false就行。这题求长度单个字符本身就是长度为1的回文序列 for(int i 0; i n; i) dp[i][i] 1; // 【细节2极致的内层起点】 // 上一题 j 从 i 开始。这题因为 dp[i][i] 已经手动初始化过了 // 所以内层直接 j i 1 开始省去了一次无意义的 if 判断 for(int i n - 1; i 0; i--) { for(int j i 1; j n; j) { if(s[i] s[j]) { // 两头相等直接把它俩包进去长度 2 dp[i][j] dp[i1][j-1] 2; } else { // 两头不相等只能扔掉一头。扔掉左头看右边扔掉右头看左边取最大值 // 【核心警醒】这里和 1143(最长公共子序列) 的逻辑一模一样 dp[i][j] max(dp[i1][j], dp[i][j-1]); } } } // 【细节3返回值】 // 上一题是统计全图 true 个数。这题求的是整个串 [0, n-1] 的最大长度 return dp[0][n-1]; } };总结1. “子串” vs “子序列”的 else 分支区别647. 回文子串要求必须连续。如果s[i] ! s[j]这区间绝对不可能是回文子串了直接false啥也不用干。516. 回文子序列只要求相对顺序可以不连续。如果s[i] ! s[j]大区间不行不代表内部没有短的回文序列所以你要找次大区间max(dp[i1][j], dp[i][j-1])。2. 揭开伪装它其实就是 1143 题把原串s正着写一遍再倒着写一遍得到s_rev。求s和s_rev的最长公共子序列LCS就是s的最长回文子序列代码的else分支max(dp[i1][j], dp[i][j-1])和 1143 题一模一样因为本质都是“跳过一个不匹配的字符”。动态规划章节总结一、背包问题01背包 vs 完全背包一维优化下类型遍历顺序要求原因01背包 (物品不重复)外层物品正序内层容量倒序倒序保证每个物品在同一轮只被选1次完全背包 (物品无限)外层物品正序内层容量正序正序允许同一物品在本轮被反复叠加求组合数 vs 求排列数仅限完全背包目标遍历顺序要求经典题目组合数 (不讲究顺序)外层物品内层容量518.零钱兑换II排列数 (讲究顺序)外层容量内层物品377.组合总和IV二、打家劫舍万能公式dp[i] max(dp[i-1], dp[i-2] 当前金额)线性 (198)直接套公式。环形 (213)分类讨论破环 → 结果 max(算[0, n-2], 算[1, n-1])。树形 (337)后序遍历返回数组[不偷当前, 偷当前]递归推导。三、股票问题层级题号与名称改动点核心逻辑 / 状态变化核心公式 / 代码动作Lv1121. 最佳时机(只买1次)限制交易次数为1买入前绝对没有历史利润利润被强制死锁为 0持有 max(昨天持有, 0 - p[i])Lv2122. 最佳时机 II(无限次)解除次数限制万能公式原貌买入时可直接用历史利润抵扣成本持有 max(昨天持有, dp[i-1][0] - p[i])Lv3714. 含手续费(无限次扣钱)每次交易收手续费不要在买入时扣 统一在“卖出”瞬间扣钱最干净不持有 max(昨天不持有, 昨天持有 p[i] - fee)Lv4309. 含冷冻期(无限次时间限制)卖出后隔一天才能买万能公式失效拆分“不持有”状态显式切断转移路径拆为保持不持有、今天卖出、冷冻期。推导“持有”时只允许从“保持不持有”转入。Lv5123. 最佳时机 III(最多2次)限制最多2次状态维度爆炸(变4个1买/1卖/2买/2卖)核心是利润复用2买 max(昨天2买, 1卖 - p[i])(用1卖的利润抵扣2买的成本)Lv6188. 最佳时机 IV(最多k次)2次变任意k次不再手写状态开2k1长度数组用奇偶步长法则一网打尽奇数下标管买dp[j] max(dp[j], dp[j-1] - p[i])偶数下标管卖dp[j] max(dp[j], dp[j-1] p[i])(循环步长j 2)四、子序列问题if (s[i] t[j])匹配时99%的题直接继承左上dp[i-1][j-1]或1。唯一例外 (115题求方案数)左上 正上 (dp[i-1][j-1] dp[i-1][j])。else (s[i] ! t[j])不匹配时看图找方向只能删t→ 只看左dp[i][j-1](392)只能删s→ 只看上dp[i-1][j](115)都能删 → 看左和上取max (1143, 583)能替换 → 看左、上、左上取min1(72)五、回文问题遍历因为依赖左下角dp[i1][j-1]所以外层i倒序内层j正序。代码偷懒技巧if (j - i 1)直接把“单字符”和“双字符aa”两种回文情况合并处理不用越界判断。六、初始化求什么dp[0]或dp[0][j]怎么初始化典型反例求方案数 / 组合数必须初始化为1518零钱兑换、115不同子序列空串也是一种方案求最小步数 / 操作数必须初始化为0, 1, 2...72编辑距离把另一个串全删光的代价求最大长度 / 最大值初始化为01143公共子序列、516回文子序列

相关文章:

代码随想录算法训练营 Day40 | 动态规划 part13

647. 回文子串 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 class Solution { public:int countSubstrings(string s) {int n s.size();vecto…...

排课软件采购要防哪些兼容问题:龙创教育深度解析智慧校园选型干货

排课软件采购要防哪些兼容问题:龙创教育深度解析智慧校园选型干货随着教育信息化建设的不断推进,越来越多的学校开始引入智能排课系统替代人工排课,解决排课效率低、冲突多的痛点。但在实际采购过程中,兼容问题是最容易被忽略、也…...

从NRZ到PAM-4:手把手解析PCIe 6.0信号编码的实战挑战与PHY选型避坑

从NRZ到PAM-4:PCIe 6.0信号编码的工程实践与PHY选型策略 当64GT/s的数据速率成为PCIe 6.0的标准配置时,硬件工程师们面临着一个关键抉择:如何在保持信号完整性的同时实现带宽翻倍?答案藏在PAM-4编码技术中——这个在112G以太网中已…...

从零到量产:手把手教你用U-Boot MMC命令为i.MX6ULL板卡烧录完整系统镜像

从零到量产:手把手教你用U-Boot MMC命令为i.MX6ULL板卡烧录完整系统镜像 在嵌入式产品开发中,系统镜像的烧录是连接硬件与软件的关键环节。对于采用NXP i.MX6ULL处理器的设备而言,掌握U-Boot的MMC命令操作不仅能提升开发效率,更能…...

直流微电网在数据中心的应用:如何用5种控制策略提升能源效率

直流微电网在数据中心的应用:如何用5种控制策略提升能源效率 数据中心作为数字经济的核心基础设施,其能耗问题日益突出。据统计,全球数据中心年耗电量已超过2000亿千瓦时,相当于某些中等国家的全年用电量。面对如此巨大的能源需求…...

从地震预测到社交网络:Hawkes过程如何成为‘连锁反应’建模的瑞士军刀?

Hawkes过程:从地震余震到社交传播的连锁反应建模利器 想象一下,当你看到社交平台上某条内容突然爆红时,背后是否存在某种规律?或者当电商平台某个商品销量激增时,是否受到前期购买行为的影响?这些看似无关…...

Sentry 从零到一:手把手部署与多端监控实战

1. 为什么选择Sentry作为错误监控方案 第一次接触Sentry是在三年前的一个深夜,当时我们线上商城突然出现大量支付失败的问题。凌晨三点,我还在服务器日志里大海捞针般寻找线索,直到同事推荐了Sentry。接入后仅用15分钟就定位到一个未处理的第…...

3步实现AI到PSD完美转换:Ai2Psd脚本终极指南

3步实现AI到PSD完美转换:Ai2Psd脚本终极指南 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd Adobe Illustrator和Photoshop是设计…...

终极指南:如何在foobar2000中实现专业级逐字歌词同步体验

终极指南:如何在foobar2000中实现专业级逐字歌词同步体验 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 你是否厌倦了传统歌词插件那种生硬的…...

Android 9.0 AOSP编译实战:手把手教你修改系统Fingerprint,绕过应用环境检测

Android 9.0 AOSP编译实战:深度定制系统指纹绕过环境检测 在移动应用生态中,越来越多的应用开始检测设备系统指纹(Fingerprint)来判断运行环境的安全性。当应用检测到test-keys等开发版标识时,可能会限制功能或直接拒绝…...

【Android】智能工具箱_1_1_8_Lwely

【Android】智能工具箱_1_1_8_去广告_解锁订阅版_Lwely 链接:https://pan.xunlei.com/s/VOqe5UC9mJL1rNZAeFOhIm0jA1?pwdhucf#这款智能工具箱解锁订阅版已去除广告干扰,集成超过百种实用工具于一体,从尺子、水平仪到系统优化功能一应俱全。界…...

TTL计算机原型Pilot-1 CPU的设计与实现

1. 项目概述:ECM-16/TTL计算机的简化验证原型Pilot-1 CPU是我在构建完整ECM-16/TTL计算机过程中的一个关键验证原型。这个采用纯TTL逻辑芯片搭建的16位处理器,虽然指令存储空间仅有16个单词(采用哈佛架构设计),但已经实…...

2026届必备的AI写作方案推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对学术研究范畴,恰到好处依循免费人工智能工具可极为突出地提高论文撰写效率。…...

程序员上手 Rust 2 年后感悟:它的确强大,但想要取代 C 还远着呢

作者 | Nabil Elqatib 译者 | 平川 策划 | 刘燕 本文最初发布于 Nabil Elqatib 的个人博客。 接触 Rust 开发快两年了。我觉得,回顾下自己在这个过程中的一些感想和汲取的经验教训,应该会很有趣。 下图是我第一次向一个 Rust 存储库提交代码。虽然时间是…...

2025届最火的五大降重复率神器解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 用于极大助力写作的辅助工具一键论文生成器,借助先进智能算法与自然语言处理技术…...

从Ubuntu双系统到形变图:手把手搞定StamPS+SBAS完整流程(含ISCE安装避坑指南)

从Ubuntu双系统到形变图:手把手搞定StamPSSBAS完整流程(含ISCE安装避坑指南) 当第一次接触InSAR处理时,最令人头疼的往往不是算法原理,而是软件环境的搭建。本文将带你从零开始,在Ubuntu双系统环境下完成St…...

从模型转换到性能评估:用RKNN-Toolkit v1.7.1跑通Mobilenet-V1完整流程实录

从模型转换到性能评估:RKNN-Toolkit v1.7.1实战全流程解析 在边缘计算领域,瑞芯微的NPU平台凭借其出色的能效比和性价比,正成为越来越多AI应用的首选硬件。而RKNN-Toolkit作为连接算法模型与硬件NPU的桥梁,其重要性不言而喻。本文…...

Hearthstone-Script终极指南:如何用Java/Kotlin打造智能炉石传说自动化脚本

Hearthstone-Script终极指南:如何用Java/Kotlin打造智能炉石传说自动化脚本 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 在炉石传说这款…...

从“拒绝访问”到注册成功:深度复盘Win10/Win11下MSCOMM控件安装的全流程避坑指南

从“拒绝访问”到注册成功:Win10/Win11下MSCOMM控件安装全流程避坑指南 当你在Windows 10或11系统上尝试运行某个老旧的工控软件或VB6程序时,突然弹出一个令人沮丧的错误提示:"没有注册类(MSCOMM)"。这个看似简单的错误背后&#x…...

GitHub 中国区前100名,哪些是真开发者?哪些是Markdown工程师?

GitHub 中国区前100名,哪些是真开发者?哪些是Markdown工程师? 大家好,我是彪哥, 本次分析的数据来源于开源项目《中国区 GitHub 用户排行榜》, 仓库数据及分析来自开源工具《悟空 GitHub 数据分析工具》&am…...

为什么你的技术演示应该告别手动排版?md2pptx让PPT制作变得简单高效

为什么你的技术演示应该告别手动排版?md2pptx让PPT制作变得简单高效 【免费下载链接】md2pptx Markdown To PowerPoint converter 项目地址: https://gitcode.com/gh_mirrors/md/md2pptx 还在为技术演示的格式调整而头疼吗?md2pptx是一款开源的Ma…...

5个场景让你的Mac音质焕然一新:eqMac音频均衡器完全指南

5个场景让你的Mac音质焕然一新:eqMac音频均衡器完全指南 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer 🎧 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac 还在为MacBook音质平平而烦恼?无论是视…...

从RSA加密到同余方程:手把手教你用扩展欧几里得算法求乘法逆元(附Python代码)

从RSA加密到同余方程:扩展欧几里得算法实战指南 在计算机科学和密码学领域,模逆元是一个看似简单却至关重要的概念。想象一下,你正在设计一个安全通信系统,或者解决一个算法竞赛中的数论问题,突然遇到了这样一个等式&a…...

【花雕学编程】Arduino BLDC 之6.5 寸轮毂电机自动跟随底盘的几种典型控制逻辑

基于 Arduino 平台控制 6.5 寸 BLDC(无刷直流)轮毂电机实现自动跟随底盘,是机器人开发中非常经典且实用的场景。6.5 寸轮毂电机因其集成了电机、减速箱和轮毂,具备大扭矩、结构紧凑的特点,非常适合此类应用。这里梳理了…...

实时操作系统(RTOS)核心原理与嵌入式开发实践

1. 实时操作系统与嵌入式系统编程概述在工业自动化、航空航天和医疗设备等关键领域,嵌入式系统必须对事件做出及时响应。实时操作系统(RTOS)作为这类系统的核心软件平台,其设计哲学与传统通用操作系统存在本质差异。我曾参与过一款…...

从Python打包exe到逆向分析:一次搞定pyinstxtractor和uncompyle6的使用

Python逆向工程实战:从打包exe到源码还原的完整指南 逆向分析Python打包的exe文件是一项兼具挑战性和实用性的技能。无论是安全研究人员、开发者还是技术爱好者,掌握这项技术都能让你在面对未知Python程序时游刃有余。本文将带你深入探索Python逆向工程的…...

嵌入式系统与CPS核心技术解析与应用实践

1. 嵌入式系统与信息物理系统概述1.1 基本概念与技术特征嵌入式系统是以专用计算机为核心,嵌入到对象体系中完成特定功能的智能化电子系统。与通用计算机系统不同,嵌入式系统具有三个显著特征:专用性:针对特定应用场景优化设计&am…...

别再用Sigmoid了!聊聊ReLU和LeakyReLU如何拯救你的深度网络训练

别再用Sigmoid了!聊聊ReLU和LeakyReLU如何拯救你的深度网络训练 深夜调试模型时,你是否遇到过这样的场景:损失函数曲线像被冻住一样纹丝不动,反向传播的梯度在深层网络中逐渐"消失"?这很可能是因为你还在使用…...

Adobe-GenP 3.0终极指南:一键快速激活Adobe CC全系列软件的完整教程

Adobe-GenP 3.0终极指南:一键快速激活Adobe CC全系列软件的完整教程 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 你知道吗?对于创意工作者…...

Windows电脑无法识别iPhone?终极解决方案:Apple-Mobile-Drivers-Installer

Windows电脑无法识别iPhone?终极解决方案:Apple-Mobile-Drivers-Installer 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地…...