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

动态规划之两个数组的dp问题(最长公共子序列)

leetcode1143题为例

 题目要求:

1.子序列

2.公共子序列的最长长度

算法原理:

经验:对于字符串的问题,我们一般是以一段区间为研究对象,因为绝大多是以某个位置为结尾解决不了问题

dp[i][j]:表示以s1的0到i区间,s2的0到j区间的所有子序列中(所有是包含以i结尾和不包含i结尾的所有子序列),最长公共子序列的长度

状态转移方程:根据最后一个位置的状况,分情况讨论

1.如果s[i]==s[j],那这个最长公共子序列肯定包含这两个相同的元素 ,只要在后面+1即可

2.如果不相等,那就需要在dp[i-1][j]和dp[i][j-1]和dp[i-1][j-1]中去找,然后取max

但第一种和第二种包含第三种,有和没有都一样,优化中我们可以去掉第三种

第一点:首先要明白空串是有研究意义的,如果公共子序列是空串就返回0

那我们可以多加一行多加一列,最上面一行表示dp[0][j]:第一个字符串是空串

第一列就表示第二个字符串是空串

那这些多加的都要初始化为0(当空串的时候公共子序列的最长长度就是0)

我们在初始化时多加一行多加一列就不会越界访问 

第二点:注意下标映射关系,但这里字符串我们可以简单处理一下

就是在每个字符串前面加一个“-”或者什么字符都可以,填表时就是从s[1]开始比较,所以填表时就是对应的

观察我们的状态转移方程,填表时需要用到哪些位置,当你填一个位置时,需要用到上面,左上,左下的位置,所以我们需要先算这些位置的值,才能算出你要填那个位置的值

所以填表顺序需要从上往下,从左往右

返回值:看定义的状态,那就是返回dp[n][m]; 

代码编写:

http://www.xdnf.cn/news/342235.html

相关文章:

  • Unity图集系统(Sprite Atlas)
  • Vue实现不同网站之间的Cookie共享功能
  • 信息系统项目管理工程师备考计算类真题讲解十四
  • 【软件设计师:软件工程】9.软件开发模型与方法
  • Java三大基本特征之多态
  • auto_ptr和unique_ptr
  • 统一授权与加密防护,CodeMeter 护航机器视觉创新全链路
  • kafka logs storage
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(16):单词与句子
  • Element-ui Table tree 结构使用(解决无展开箭头)
  • (14)Element Plus项目综合案例
  • 基础算法系列——树的入门
  • kafka records deletion policy
  • 如何设置内网映射端口到外网访问?哪些软件可以进行端口映射?
  • 2025.05.07-携程春招笔试第二题
  • flutter build apk出现的一些奇怪的编译错误
  • K8s网络从0到1
  • 《易语言学习大全》
  • k8s术语之DaemonSet
  • [python] 函数基础
  • 深入解析asyncio的实现与应用
  • C#简易Modbus从站仿真器
  • 如何将 Build at、Hash 和 Time git 的 Tag 号等构建信息,自动写入一个 JSON 文件
  • sql serve 多表联合查询,根据一个表字段值动态改变查询条件
  • 【Dify系列教程重置精品版】第七章:在Dify对话中显示本地图片之FastAPI与Uvicorn
  • PCL点云按指定方向进行聚类(指定类的宽度)
  • mission planner烧录ardupilot固件报错死机
  • ESP32开发之freeRTOS的互斥量
  • 网络协议之DHCP和PXE分析
  • QT中多线程的实现