[动态规划 & 滑动窗口]

1. 定义DP状态(核心思路)

问题分析


word1 转换为 word2,每个操作对应状态转移。定义 dp[i][j] 表示将 word1[0..i-1] 转换为 word2[0..j-1] 的最小操作数。

2. 初始化DP表

目的:处理空字符串的边界情况。

3. 填充DP表(状态转移方程)

状态转移逻辑

  • 若 word1[i-1] == word2[j-1]:无需操作,直接继承左上方值 → dp[i][j] = dp[i-1][j-1]
  • 否则:取三种操作的最小值 + 1
    dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
class Solution {
public:
    int minDistance(string word1, string word2) {
        int m = word1.size(), n = word2.size();
        vector<
### 滑动窗口算法动态规划的区别和应用场景 #### 一、滑动窗口算法概述 滑动窗口是一种优化技巧,主要用于线性数据结构(如数组或字符串)中的子序列问题。其核心思想是通过维护一个可变大小的窗口来遍历整个数据集,从而避免重复计算。这种方法特别适用于需要频繁更新局部状态并快速得出结论的情况[^1]。 例如,在寻找最小覆盖子串的问题中,可以通过调整窗口两端的位置逐步缩小候选区域直到找到最优解为止。相比暴力枚举所有可能组合的方式,该方法显著降低了时间复杂度。 ```python def min_window(s, t): from collections import defaultdict need = defaultdict(int) window = defaultdict(int) for c in t: need[c] += 1 left, right = 0, 0 valid = 0 start, length = 0, float(&#39;inf&#39;) while right &lt; len(s): c = s[right] right += 1 if c in need: window[c] += 1 if window[c] == need[c]: valid += 1 while valid == len(need): d = s[left] if right - left &lt; length: start = left length = right - left left += 1 if d in need: if window[d] == need[d]: valid -= 1 window[d] -= 1 return &quot;&quot; if length == float(&#39;inf&#39;) else s[start:start+length] ``` 上述代码展示了如何利用滑动窗口求解最小子串匹配问题。 --- #### 二、动态规划简介 动态规划(Dynamic Programming, DP)是一种分阶段解决问题的方法论,它依赖于两个重要性质:重叠子问题和最优子结构性质。对于满足这些条件的问题,我们可以将其分解成更简单的子问题,并存储中间结果以供后续调用,最终达到全局最优的目的[^4]。 典型例子包括斐波那契数列、背包问题以及最长公共子序列等问题。下面是一个关于爬楼梯的经典案例: ```python def climb_stairs(n): dp = [0]*(n+1) dp[0], dp[1] = 1, 1 for i in range(2, n+1): dp[i] = dp[i-1] + dp[i-2] return dp[n] ``` 此函数实现了基于动态规划原理计算到达第`n`级台阶的不同路径总数的功能。 --- #### 三、两者对比分析 | 特征 | **滑动窗口** | **动态规划** | |--------------------|--------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| | 数据类型 | 主要针对连续的一维或多维数组/字符串 | 可应用于离散型变量组成的各类集合 | | 时间效率 | 高效;通常能在线性时间内完成 | 较低;取决于具体实现方式 | | 存储需求 | 小巧灵活;只需记录当前窗口边界及相关统计信息 | 大量内存消耗;需保存大量历史状态 | | 应用领域 | 字符串模式匹配、实时数据分析 | 组合数学建模、资源分配 | 尽管二者都追求高效解决方案,但它们的设计理念截然不同&mdash;&mdash;前者强调即时响应能力,后者注重整体性能最大化[^4]。 --- #### 四、实际运用举例说明 ##### (1)滑动窗口的应用实例 在网络通信协议TCP/IP中,&ldquo;拥塞控制&rdquo;机制就采用了类似的思路。发送方维持一定数量未确认报文段作为&ldquo;窗口&rdquo;,依据接收反馈动态调节传输速率,既保障链路利用率又防止过载现象发生[^2]。 ##### (2)动态规划的实际落地 在基因组学研究领域,科学家们常借助Needleman-Wunsch算法比较两条DNA序列相似程度。这一过程正是建立在一个二维表格之上逐格填充得分直至终点位置的过程,完美体现了动态规划精髓所在。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值