动态规划-------- dp数组套路学习

求两个数组或者字符串的子序列问题, 要用动态规划的时候:

当单个数组或者字符串要用动态规划时,可以把动态规划 dpi 定义为 nums0:i 中想要求的结果;当两个数组或者字符串要用动态规划时,可以把动态规划定义成两维的 dpij ,其含义是在 A0:i−1 与 B0:j−1 之间匹配得到的想要的结果。 https://leetcode.cn/problems/is-subsequence/solutions/1361126/by-nehzil-ixw6/

看别人的动态规划解法的时候,对 dpij 代表了什么一无所知就看不懂代码。要是把 dpij 理解为 s 字符串出现在 ti:j 中,即 t 中以 i 下标开始,j 下标结束的子字符串包含了 s,那要是不包含呢?岂不是解不出来。所以 dpij 就代表 s0:i 和 t0:j 的公共字符串长度,如果最后它等于 s.length ,那么s 字符串就被 t 字符串所包含。

所以 dpij 就是 s0:i 和 t0:j 在做比较,如果它们的最末尾字符 si-1==tj-1 ,那么dpij=dpi-1j-1 +1;dpi-1j-1 代表 s0:i-1 和 t0:j-1 在做比较。

如果 si-1 !=tj-1,那么就 j 前进一位,让 s0:i 和 tj+1 做比较,其实此时的比较结果和 s0:i 和 t0:j-1 的比较结果一样,即 dpij=dpij-1

这就是状态转移公式,在推导状态转移公式时,就像我们使用数学归纳法一样,因为它有最优子结构,dpij 要怎么得到?它的上一步是什么?这就是转态转移公式。然后考虑边界情况和初始情况,但最开始我们必须明确 dpij 的含义是什么。

Go 复制代码
func isSubsequence(s string, t string) bool {
	m, n := len(s), len(t)
	dp := make([][]int, m+1)
	for i := 0; i < m+1; i++ {
		dp[i] = make([]int, n+1)
	}
	for i := 1; i <= m; i++ {
		for j := 1; j <= n; j++ {
			if s[i-1] == t[j-1] {
				dp[i][j] = dp[i-1][j-1] + 1
			} else {
				dp[i][j] = dp[i][j-1]
			}
		}
	}
	return dp[m][n] == m
}
相关推荐
Wang's Blog18 分钟前
AI Agent白手起家63: LangGraph 人机交互——让人类介入 AI 工作流
人工智能·算法·人机交互
@松33 分钟前
STM32F103C8-GPIO—位带操作学习
stm32·嵌入式硬件·学习
乐观勇敢坚强的老彭42 分钟前
C++ STL 常用容器的速查表
java·c++·算法
北冥you鱼44 分钟前
深入解析 Go 中 sync.YAML.Unmarshal:如何将 YAML 数据填充到 Config 结构体
开发语言·算法·golang
迷路爸爸1801 小时前
Claude Code 核心设计学习记录
学习·microsoft·agent·智能体·multi-agent·claude code
星轨初途2 小时前
LeetCode 热题 100——day11 滑动窗口最大值
数据结构·c++·算法·leetcode·职场和发展
gbase_lmax2 小时前
深度递归与广度递归(DFS,BFS)实现
算法·深度优先·宽度优先
西柚研究生1234563 小时前
论文分析15:跨层特征交互的多尺度无人机小目标检测算法
人工智能·算法·目标检测
rannn_11110 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer10 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯