动态规划专练:力扣第718、1143题
力扣第718题-最长重复子数组1.本题是一道考察动态规划的经典问题设置一个二维dp[nums1Size 1][nums2Size 1]数组来记录长度为i的nums1和长度为j的nums2的最长公共子数组长度元素初始化为0。当nums1[i - 1] nums2[j - 1]时说明当前元素相同此时的最长公共子数组长度dp[i][j]就等于dp[i - 1][j - 1] 1。每次循环都更新当前最长的公共子数组长度res。完整代码如下1. int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size) { 2. // dp[i][j]nums1前i个、nums2前j个元素以nums1[i-1]、nums2[j-1]结尾的最长公共子数组长度 3. int dp[nums1Size 1][nums2Size 1]; 4. // 初始化dp数组全部置0 5. for (int i 0; i nums1Size; i){ 6. memset(dp[i], 0, sizeof(dp[i])); 7. } 8. 9. int res 0; 10. // 遍历nums1每一位 11. for (int i 1; i nums1Size; i){ 12. // 遍历nums2每一位 13. for (int j 1; j nums2Size; j){ 14. // 当前两数字相等公共子数组长度 左上角dp值 1 15. if (nums1[i - 1] nums2[j - 1]){ 16. dp[i][j] dp[i - 1][j - 1] 1; 17. } 18. // 不相等时dp[i][j]保持0更新全局最大长度 19. res fmax(res, dp[i][j]); 20. } 21. } 22. 23. return res; 24. }该算法时间复杂度和空间复杂度均为O(nums1Size * nums2Size)。2.可以看到递推公式中当前项的dp只和上一层的有关所以可以将二维dp数组改为一维动态dp数组。需要注意的是此时的内层循环就需要逆序遍历防止元素被重复计算同时当nums1[i - 1] ! nums2[j - 1]时说明连续子数组在这里断掉了需要将当前dp值置零。完整代码如下1. int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size) { 2. // 一维滚动dp数组dp[j]表示nums1前i个、nums2前j个以末尾元素结尾的最长公共子数组长度 3. int dp[nums2Size 1]; 4. // 数组初始化为0 5. memset(dp, 0, sizeof(dp)); 6. 7. int res 0; 8. // 遍历nums1每一个元素 9. for (int i 1; i nums1Size; i){ 10. // 倒序遍历nums2防止dp[j-1]提前被覆盖 11. for (int j nums2Size; j 1; j--){ 12. if (nums1[i - 1] nums2[j - 1]){ 13. // 当前元素匹配继承左上方dp[j-1]的值并1 14. dp[j] dp[j - 1] 1; 15. } else { 16. // 元素不匹配以当前位置结尾的公共子数组长度归零 17. dp[j] 0; 18. } 19. // 更新全局最长公共子数组长度 20. res fmax(res, dp[j]); 21. } 22. } 23. 24. return res; 25. }该算法时间复杂度为O(nums1Size * nums2Size)空间复杂度为O(nums2Size)。力扣第1143题-最长公共子序列1.本题和力扣第718题-最长重复子数组比较相似区别在于本题的公共子序列不要求连续这就代表最长公共子序列的值在dp数组中可以继承而不是清零。当text1[i - 1] text2[j - 1]时递推公式仍为dp[i][j] dp[i - 1][j - 1] 1而不相等时就要比较上方或者左边的较大值来继承从这两个方向前进一步都可以到达当前位置所以有两种情况递推公式为dp[i][j] fmax(dp[i - 1][j], dp[i][j - 1])。完整代码如下1. int longestCommonSubsequence(char* text1, char* text2) { 2. // 获取两个字符串长度 3. int len1 strlen(text1); 4. int len2 strlen(text2); 5. // dp[i][j]text1前i个字符、text2前j个字符的最长公共子序列长度 6. int dp[len1 1][len2 1]; 7. // 将dp数组全部初始化为0 8. for (int i 0; i len1; i){ 9. memset(dp[i], 0, sizeof(dp[i])); 10. } 11. 12. // 遍历text1每个字符 13. for (int i 1; i len1; i){ 14. // 遍历text2每个字符 15. for (int j 1; j len2; j){ 16. if (text1[i - 1] text2[j - 1]){ 17. // 字符相等公共子序列长度等于左上角值1 18. dp[i][j] dp[i - 1][j - 1] 1; 19. } else { 20. // 字符不等取上方或左方较大值 21. dp[i][j] fmax(dp[i - 1][j], dp[i][j - 1]); 22. } 23. } 24. } 25. 26. // 两字符串全部字符对应的最长公共子序列结果 27. return dp[len1][len2]; 28. }该算法时间复杂度和空间复杂度均为O(len1 * len2)。2.本题也可以使用一维动态dp数组内层循环由于在字符不等的情况下必须比较同行左边的和上一次当前位置的值所以dp[j - 1]需要使用已经更新后的值必须使用正序遍历。同时为了避免元素被重复使用需要一个记录之前元素的变量pre和一个记录当前元素的变量cur来辅助之前都是通过逆序来解决。完整代码如下1. int longestCommonSubsequence(char* text1, char* text2) { 2. int len1 strlen(text1); 3. int len2 strlen(text2); 4. // 一维滚动dp数组dp[j]代表text1前i个字符、text2前j个字符的LCS长度 5. int dp[len2 1]; 6. memset(dp, 0, sizeof(dp)); 7. 8. for (int i 1; i len1; i){ 9. // pre保存dp[j-1]更新前的值等价二维dp[i-1][j-1] 10. int pre dp[0]; 11. for (int j 1; j len2; j){ 12. // 记录更新前的dp[j]作为下一轮j1的pre 13. int cur dp[j]; 14. if (text1[i - 1] text2[j - 1]){ 15. // 字符匹配取左上角pre1 16. dp[j] pre 1; 17. } else { 18. // 不匹配取上方旧dp[j]或左侧新dp[j-1]最大值 19. dp[j] fmax(dp[j], dp[j - 1]); 20. } 21. pre cur; 22. } 23. } 24. 25. return dp[len2]; 26. }该算法时间复杂度为O(len1 * len2)空间复杂度为O(len2)。3.遍历方向由状态转移方程中最严苛的依赖限制唯一决定。只要推导分支中存在任何对当前行新数据如dp[i][j-1]的依赖就强制要求正序遍历。在此强制正序的前提下为解决同时需要上一行旧数据如dp[i-1][j-1]造成的读写冲突不改变遍历方向而是通过引入标量缓存即pre变量进行空间置换。

相关新闻

从零开始玩转 klogg 日志查看器:30 分钟上手极速搜索与超大日志分析

从零开始玩转 klogg 日志查看器:30 分钟上手极速搜索与超大日志分析

从零开始玩转 klogg 日志查看器:30 分钟上手极速搜索与超大日志分析 【免费下载链接】klogg Really fast log explorer based on glogg project 项目地址: https://gitcode.com/gh_mirrors/kl/klogg 凌晨两点,监控大屏突然一片飘红。你哆嗦着把一…

2026/10/12 20:34:06 阅读更多 →
sys-con 手柄插件使用终极指南:免费让 Xbox 与 PlayStation 手柄在 Switch 上一步到位

sys-con 手柄插件使用终极指南:免费让 Xbox 与 PlayStation 手柄在 Switch 上一步到位

sys-con 手柄插件使用终极指南:免费让 Xbox 与 PlayStation 手柄在 Switch 上一步到位 【免费下载链接】sys-con Nintendo Switch sysmodule that allows support for third-party controllers 项目地址: https://gitcode.com/gh_mirrors/sy/sys-con 刚入坑 …

2026/10/12 21:28:42 阅读更多 →
同城中台系统核心表设计与模块启用状态机(代码深讲)

同城中台系统核心表设计与模块启用状态机(代码深讲)

县城创业者评估「同城中台系统」时,技术侧常纠结功能捆绑:是否必须一次启用全部业务域?下文用模块注册表、启用状态机与 Service 伪代码说明「统一中台 按需启用模块」如何落地,并给出低成本试水期的联调验收点。示例为教学示意。…

2026/10/12 22:19:44 阅读更多 →

最新新闻

MoE稀疏激活与FP8量化:本地大模型轻量化的实战指南

MoE稀疏激活与FP8量化:本地大模型轻量化的实战指南

1. 项目概述:一场没有硝烟的七日技术风暴“国庆七天,AI圈没一天消停”——这句话不是夸张修辞,而是过去七年里我持续追踪AI产业动态过程中,头一回在长假期间亲眼见证的、真正意义上的“全周期高强度技术迭代现场”。它不像往年那样…

2026/10/13 22:04:47 阅读更多 →
PSO+SA混合优化算法实战:非凸问题高精度求解指南

PSO+SA混合优化算法实战:非凸问题高精度求解指南

简介:本资源为PSO与模拟退火(SA)融合算法的MATLAB实现包,面向智能优化方向的本科生、研究生及算法工程师,聚焦解决复杂多模态函数优化中易陷局部最优、收敛精度不足等典型问题。压缩包共9个文件(5个核心m脚…

2026/10/13 22:04:47 阅读更多 →
谷歌Agent Skill设计模式实战:从工具调用到规划型,5种模式提升生产稳定性

谷歌Agent Skill设计模式实战:从工具调用到规划型,5种模式提升生产稳定性

1. 从“能跑通”到“跑得稳”:Agent Skill 设计模式到底在解决什么问题很多人第一次接触 Agent 开发时,都会经历一个相似的阶段:写一个能调用工具的循环,接上大模型,跑通一个“查天气”“搜资料”“发邮件”的 Demo&am…

2026/10/13 22:04:47 阅读更多 →
种子填充算法详解:从递归实现到扫描线优化

种子填充算法详解:从递归实现到扫描线优化

计算机图形学课程做到实验四,很多同学的卡点已经从“直线怎么画”变成了“一个多边形怎么填满”。前几次实验跑通了点、线、圆这些基本图元之后,到这一步要处理的不再是一条条轮廓线,而是一块块有边界的区域。种子填充算法就是这条线路上最直…

2026/10/13 22:04:47 阅读更多 →
语义词谜游戏设计:绕过拼写训练词汇提取能力

语义词谜游戏设计:绕过拼写训练词汇提取能力

1. 项目概述:当词典变成游戏界面,我们到底在玩什么? “Show HN: Wick, a daily word game where you guess by meaning, not spelling”——这个标题一出现,我就在某开发者社区的首页多刷了三遍。不是因为它的UI有多炫&#xff0c…

2026/10/13 22:04:47 阅读更多 →
Python Plotly交互式数据可视化:从快速出图到精细定制

Python Plotly交互式数据可视化:从快速出图到精细定制

做数据分析的同学都有一个共同感受:数据算完之后,最头疼的不是处理逻辑,而是怎么把结果变成一张别人一眼能看懂的图。这两年我用得最顺手的工具就是 Plotly,一个典型的 Python 交互式绘图库。用 Plotly 创建交互式图表&#xff0c…

2026/10/13 22:03:47 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →