
leetcode-动态规划专题
leetcode题库中的动态规划题目的题解
忆殇DR
程序猿的路,该一个人慢慢走,个中滋味,只有自己最懂……
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[Leetcode 120] Dynamic Programming - Triangle(三角形最小路径和)
这个题是维特比算法的一个典型应用,为了求全局最短路径,必须知道从初始位置到当前各位置的最短路径,再从当前位置,依次找到到达下一位置的最短路径。为什么通过找到从初始位置到当前可到达位置的局部最优路径最终就能得到全局最优路径呢?设这条路径需要经过t个点,每个点的权重不相同,最后找到了一条路径,这条路径上的t个点的权值之和最小。令这条路径上的第i个点(0<i<t0 < i < ...原创 2020-02-13 17:08:49 · 205 阅读 · 0 评论 -
[Leetcode 91] Dynamic Programming - Decode Ways(解码方法)
dp[i]dp[i]dp[i]表示从左到右取sss的长度为i+1i+1i+1的子串,这个子串有多少种可解码方式。dp的公式应该是:如果以dp[i−1]dp[i-1]dp[i−1]为十位和以dp[i]dp[i]dp[i]为个数组成的数字大于等于1小于等于26dp[i]=dp[i−2]+dp[i−1]dp[i]=dp[i-2]+dp[i-1]dp[i]=dp[i−2]+dp[i−1]当不满足...原创 2019-12-28 11:15:06 · 190 阅读 · 0 评论 -
[Leetcode 64] Dynamic Programming - Minimum Path Sum(最小路径和)
这道题也是得从终点往前进行dp的,每次决定当前位置到终点的最小路径和dp[i][j]dp[i][j]dp[i][j]表示从位置(i,j)(i,j)(i,j)到终点的最小路径和,状态转移方程为:dp[i][j]=min(dp[i+1][j],dp[i][j+1])+dp[i][j]dp[i][j]=min(dp[i+1][j], dp[i][j+1])+dp[i][j]dp[i][j]=min(...原创 2019-12-16 15:29:39 · 150 阅读 · 0 评论 -
[Leetcode 63] Dynamic Programming - Unique Paths II(不同路径 II)
这个题应该考虑从终点开始,和前一个问题的不同在于要把不能通过的障碍考虑进去。在障碍位置的可走路径数应该为0dp[i][j]dp[i][j]dp[i][j]表示从坐标(i,j)(i,j)(i,j)到终点的可走路径数从终点开始往回填表,遇到障碍则障碍位置的可走路径数就是0。如果当前位置不是障碍,则当前位置(i,j)(i,j)(i,j)的可走路径数为:dp[i][j]=dp[i+1][j]+dp...原创 2019-12-16 11:52:37 · 148 阅读 · 0 评论 -
[Leetcode 62] Dynamic Programming - Unique Paths(不同路径)
这道题最直观的dp思路其实就是填满一张二维表dpdpdp即可,二维表的大小为m×nm\times nm×n。二维表中的元素dp[m][n]dp[m][n]dp[m][n]表示从起始点到达坐标为(m,n)(m,n)(m,n)位置的所有不同路径的总数。状态转移的方程为:dp[m][n]=dp[m−1][n]+dp[m][n−1]dp[m][n] = dp[m-1][n] + dp[m][n-1]d...原创 2019-12-15 21:54:42 · 145 阅读 · 0 评论 -
[Leetcode 746] Dynamic Programming - Min Cost Climbing Stairs(使用最小花费爬楼梯)
一开始我的做法是用一个二维数组来做dp,但后来发现,其实每次只需要保存上一步dp的两个值即可,于是对dp方法又做了改进.第一种解法首先说一下用二维数组做dp的方法:dp数组有两行:第一行表示走当前阶梯,如果走了当前阶梯,则第n-1个阶梯可走可不走,取走与不走的最小值加上当前第n步的花费,即为走当前步的最小值,则最低花费为dp[0][n]=min(dp[0][n−1],dp[1][n−...原创 2019-12-15 21:03:55 · 169 阅读 · 0 评论 -
[Leetcode 392] Dynamic Programming - Is Subsequence
这个题目要求匹配的子序列并不连续,只要保持相对关系即可,所以最简单的方法,就是定义一个标志字段来指示当前子串中需要匹配的值的位置(初始化值为0),依次在主串匹配子串中当前需要匹配的字符,如果匹配到了就将标志字段中的值加1,直到子串完全匹配输出True,或者主串遍历完也没有完全子串则输出False。class Solution(object): def isSubsequence(se...原创 2019-12-05 16:49:56 · 125 阅读 · 0 评论 -
[Leetcode 303] Dynamic Programming - Range Sum Query - Immutable
初始化:dp[0]=nums[0]dp[0]=nums[0]dp[0]=nums[0]状态转移:dp[n]=dp[n−1]+nums[n]dp[n] = dp[n-1] + nums[n]dp[n]=dp[n−1]+nums[n]每次求区间[i,j][i,j][i,j]之间的值之和的方法:SumRang(i,j)=dp[j]−dp[i]+nums[i]SumRang(i,j) = dp[j...原创 2019-12-04 21:03:38 · 114 阅读 · 0 评论 -
[Leetcode 198] Dynamic Programming - House Robber
198. House Robber这个题的问题其实可以改写为:从给定序列中选取一个数据之间不相邻的子序列,要求这个序列的和最大,输出这个最大的和。动归的状态转移函数为:f(n)=max(f(n−1),f(n−2)+nums[n])f(n) = max(f(n-1), f(n-2)+nums[n])f(n)=max(f(n−1),f(n−2)+nums[n])其中:f(n−1)f(n-1...原创 2019-12-04 20:57:40 · 186 阅读 · 0 评论 -
[Leetcode 121] Dynamic Programming - Best Time to Buy and Sell Stock
这道题每次把当前已经遍历过的部分子序列中的最小值作为买入价格,因为只有买入价格最小,才能得到最大的收益。 然后每次尝试将当前价格作为卖出价格,如果收益大于当前最大收益,则更新最大收益值。class Solution(object): def maxProfit(self, prices): """ :type prices: List[int] ...原创 2019-12-04 16:55:56 · 181 阅读 · 0 评论 -
[Leetcode 70] Dynamic Programming - Climbing Stairs
70. Climbing Stairs这道题其实是一个很典型的递归问题,递归函数都是和斐波那契问题相似的:f(n)=f(n−1)+f(n−2)f(n) = f(n-1)+f(n-2)f(n)=f(n−1)+f(n−2)dp的想法主要是在递归的过程中复用已经遍历的状态f(n)f(n)f(n),如果这个状态下的方法数已经确定,则不需要再继续往下遍历,直接返回保存的方法数即可。class So...原创 2019-12-04 10:51:58 · 198 阅读 · 0 评论 -
[Leetcode 1025] Dynamic Programming - Divisor Game
1025 - Divisor Game第一种解法可以直接考虑这道题是否存在必胜策略:首先考虑最终失败的情况必定是谁的数字变为1谁就失败,不可能是其他情况。再由题目我们可以思考:如果输入是一个偶数,那么减掉一个比它小且能整除它的正数,最后得到的可以是一个偶数(减掉的数不为1)也可以是一个奇数(减掉的数是1)如果输入是一个奇数,那么减掉一个比它小且能整除它的正数,最后得到的一定是一个偶数...原创 2019-12-03 21:00:35 · 307 阅读 · 0 评论