记忆化搜素与动态规划
文章平均质量分 78
萘柰奈
为做出自己的游戏而努力喵
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode刷题记录----72.编辑距离(Medium)
本文通过动态规划方法解决编辑距离问题(LeetCode 72题)。解题思路是从字符串末尾开始比较字符,若不相同则进行插入、删除或替换操作。关键点在于发现对word1的修改操作等价于对word2的相应操作,从而简化状态转移方程为dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1。边界条件初始化后,通过二维数组实现状态转移,最终得到最小编辑距离。算法时间复杂度O(MN),空间复杂度O(MN)。总结指出动态规划解题要点:从递归思路出发,识别状态转移条件原创 2025-10-09 10:23:42 · 880 阅读 · 0 评论 -
LeetCode刷题记录----1143.最长公共子序列(Medium)
【摘要】1143题最长公共子序列采用二维动态规划解法。定义dp[i,j]表示text1前i个字符与text2前j个字符的最长公共子序列长度。边界条件为dp[0,j]=dp[i,0]=0。状态转移分两种情况:当字符匹配时dp[i,j]=dp[i-1,j-1]+1;不匹配时取dp[i-1,j]和dp[i,j-1]的最大值。该算法时间复杂度O(MN),空间复杂度O(MN),是处理字符串公共子序列问题的典型动态规划方法。原创 2025-09-28 10:17:42 · 171 阅读 · 0 评论 -
LeetCode刷题记录----5.最长回文子串(Medium)
摘要:本文探讨了最长回文子串问题的两种解法。动态规划法通过构建二维数组dp[i][j]记录子串是否为回文,状态转移方程为dp[i][j]=(s[i]==s[j])&&dp[i+1][j-1]。中心扩展法则通过枚举所有可能的回文中心(奇数和偶数长度),向两侧扩展寻找最长回文。两种方法都利用了回文串的特性:首尾字符相同且子串也是回文。动态规划空间复杂度为O(n²),而中心扩展法空间复杂度为O(1)。(149字)原创 2025-09-27 09:18:56 · 858 阅读 · 0 评论 -
LeetCode刷题记录----62.不同路径(Medium)
本文探讨了LeetCode 62题"不同路径"的三种解法。基础解法使用二维动态规划,记录每个格子的路径数,状态转移方程为dp[i][j] = dp[i-1][j] + dp[i][j-1]。优化解法将空间压缩为一维数组,利用dp[j] += dp[j-1]更新状态。最优解法通过组合数学原理,计算移动次数的组合数C(m+n-2,m-1)。三种方法的时间复杂度分别为O(mn)、O(mn)和O(m),空间复杂度依次优化为O(n)和O(1)。文章强调了动态规划的模式识别和状态压缩技巧,以及数学原原创 2025-09-26 10:44:43 · 1250 阅读 · 0 评论 -
LeetCode刷题记录----32.最长有效括号(Hard)
本文介绍了使用动态规划求解最长有效括号长度的方法。关键思路是定义dp[i]为以字符s[i]结尾的最长有效括号长度,并分情况处理')'字符:当遇到"()"时,dp[i]=dp[i-2]+2;当遇到"))"时,若匹配到对应的'(',则dp[i]=dp[i-1]+dp[i-dp[i-1]-2]+2。该算法时间复杂度O(n),空间复杂度O(n)。核心启示是:动态规划中子问题的定义要尽可能简单明确,通过限制条件简化状态转移方程的推导。原创 2025-09-25 10:36:45 · 642 阅读 · 0 评论 -
LeetCode刷题记录----152.乘积最大子数组(Medium)
摘要:该文介绍了用动态规划求解最大乘积子数组问题。关键点在于同时维护两个状态数组:maxF记录到当前位置的最大乘积,minF记录最小乘积。状态转移时考虑三种情况:延续之前的乘积、重新开始或负负得正。最终在maxF数组中取最大值即为答案。算法时间复杂度O(N),空间复杂度O(N)。核心思想是通过同时跟踪最大最小值来处理元素正负带来的影响。原创 2025-09-23 11:32:30 · 411 阅读 · 0 评论 -
LeetCode刷题记录----416.分割等和子集(Medium)
该问题考察将数组分割为两个等和子集的可能性。解题思路:1)首先判断总和是否为偶数;2)转化为0-1背包问题,寻找和为sum/2的子集。通过逐步优化,从回溯法到带记忆的DFS,再到二维DP,最终优化为一维DP。关键点:总和必须为偶数;转化为背包问题;优化空间复杂度时需逆向遍历。最优解使用一维DP数组,时间复杂度O(N*target),空间复杂度O(target)。原创 2025-09-23 11:17:34 · 1500 阅读 · 0 评论 -
LeetCode刷题记录----300.最长递增子序列(Medium)
本文介绍了求解最长递增子序列的动态规划方法。通过定义dp[i]表示以nums[i]结尾的最长子序列长度,初始值设为1。状态转移时,若nums[j]<nums[i](j<i),则更新dp[i]为max(dp[i], dp[j]+1)。最终结果为dp数组中的最大值。该方法时间复杂度为O(n²),空间复杂度为O(n)。关键点在于正确识别状态转移条件(nums[j]<nums[i]),确保子序列严格递增。原创 2025-09-22 11:41:48 · 216 阅读 · 0 评论 -
LeetCode刷题记录----139.单词拆分(Medium)
该题解使用动态规划解决字符串拆分问题。定义dp[i]表示前i个字符能否被字典中的单词拆分。初始化dp[0]为true(空字符串可拆分)。状态转移时,遍历所有可能的分割点j,若dp[j]为true且子串s[j..i-1]在字典中,则dp[i]=true。使用哈希集合存储字典以提高查询效率。时间复杂度O(n^2),空间复杂度O(n)。关键点在于利用已知子问题结果,避免重复计算,通过分割点将问题分解为两个子问题判断。原创 2025-09-22 11:27:34 · 452 阅读 · 0 评论 -
LeetCode刷题记录----322.零钱兑换(Medium)
本文探讨了解决零钱兑换问题的两种主要方法:动态规划和记忆化深度优先搜索。动态规划方法通过构建dp数组,其中dp[i]表示凑到金额i所需的最少硬币数,采用状态转移方程dp[i]=min(dp[i],dp[i-coin]+1)进行求解,时间复杂度为O(NAmount)。优化后的动态规划方案避免了预处理硬币数组,直接通过遍历计算状态值。另一种方法是记忆化DFS,通过递归和剪枝来减少重复计算,同样达到O(NAmount)的时间复杂度。文章强调解决此类问题需明确状态定义和转移方程,当问题可分解为子问题时,动态规划或记原创 2025-09-21 17:36:42 · 1010 阅读 · 0 评论 -
LeetCode刷题记录----279.完全平方数(Medium)
该文探讨了完全平方数问题的两种解法:动态规划和数学优化。动态规划解法通过构建dp数组,记录每个数的最小完全平方数和,时间复杂度O(n√n)。数学优化基于拉格朗日四平方定理,将问题转化为判断数字能否表示为1/2/3/4个平方数之和,时间复杂度降至O(√n)。文章强调了枚举在解决数字相加问题中的重要性,并比较了两种方法的优劣,指出数学方法在效率上的显著优势。原创 2025-09-20 11:31:44 · 582 阅读 · 0 评论 -
LeetCode刷题记录----198.打家劫舍(Medium)
本文讨论了"打家劫舍"问题的动态规划解法。对于一排房屋,每个房屋有两种选择(偷或不偷),决策取决于前一个房屋的状态。建立动态规划数组dp[i]表示偷到第i个房屋的最大金额,状态转移方程为dp[i]=max(dp[i-2]+nums[i], dp[i-1])。算法时间复杂度O(n),空间复杂度O(n)。关键在于识别每个房屋的状态选择及其与前序房屋的关系,从而建立正确的状态转移方程。原创 2025-09-20 11:11:25 · 444 阅读 · 0 评论 -
LeetCode刷题记录----70.爬楼梯(easy)
摘要:本文讨论了爬台阶问题的三种解法。首先采用递归方法,发现存在重复计算导致超时;然后引入记忆化搜索优化,通过字典存储已计算结果,将时间复杂度降为O(n);最后提出动态规划解法,仅用三个变量迭代计算,空间复杂度优化为O(1)。三种方法都基于相同的子问题分解思路,但通过不同优化手段逐步提升了效率。结果表明,递归问题可通过记忆化或动态规划来避免重复计算。原创 2025-07-09 09:52:09 · 525 阅读 · 0 评论
分享