揭秘动态规划高手进阶秘籍:轻松连克两题,掌握移动下标的精髓
2023-09-04 21:21:20
一、踏上征程:动态规划初探
动态规划(Dynamic Programming)是一种经典的算法设计范式,它以自底向上的思想,通过逐层递推的方式,逐步求解复杂问题。
动态规划算法的关键在于寻找问题的最优子结构,即将复杂的问题分解成若干个相互关联的子问题,然后将子问题的最优解作为基础,递推求解整个问题的最优解。
二、勇攀高峰:两题精讲
- 题目63:Unique Paths II
给定一个矩阵,其中某些方格包含障碍物(用'1'表示),其余方格都可通行(用'0'表示)。求从矩阵的左上角移动到右下角的唯一路径数目。
在讲解这道题之前,我们先来看一看题目的本质。我们只需要关心那些可通行的方格,因为我们只能在这些方格内移动。因此,我们可以将矩阵中所有障碍物方格变为不可通过的方格,然后求出从矩阵的左上角移动到右下角的唯一路径数目。
这就是我们所要解决的问题。那么,如何求解呢?我们可以使用动态规划算法。首先,我们需要定义一个动态规划数组dp,其中dp[i][j]表示从左上角移动到第i行第j列的唯一路径数目。
然后,我们就可以按照以下步骤求解:
-
初始化:
- 将dp[0][0]设为1,因为从左上角只能移动到右上角,因此路径数目为1。
- 将dp[i][0]和dp[0][j]均设为0,因为从第i行到第0列或从第0行到第j列只能通过障碍物方格,因此路径数目为0。
-
递推:
-
对于其余方格,可以使用下面的递推关系求解:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
这个递推关系的含义是,从左上角移动到第i行第j列的唯一路径数目等于从左上角移动到第i-1行第j列的唯一路径数目加上从左上角移动到第i行第j-1列的唯一路径数目。
-
-
结果:
- 最终,dp[m][n]就是从左上角移动到右下角的唯一路径数目。
-
题目64:Minimum Path Sum
给定一个矩阵,其中每个方格包含一个非负整数,求从矩阵的左上角移动到右下角的最小路径和。
这道题与题目63非常相似,但是目标发生了变化。我们要求的是从左上角移动到右下角的最小路径和。
解决这道题,我们可以继续使用动态规划算法。但是,我们需要对dp数组进行一些修改。
三、移动下标的小技巧
在动态规划算法中,我们经常需要使用下标来访问数组元素。如果数组比较大,下标的移动很容易出错。为了避免这种情况,我们可以使用一些小技巧来移动下标。
例如,我们可以使用以下方式移动下标:
-
使用增量
我们可以使用增量来移动下标。例如,我们可以使用++和--来分别增加和减少下标的值。
-
使用乘法
我们可以使用乘法来移动下标。例如,我们可以使用*2和/2来分别将下标值翻倍和减半。
-
使用模运算
我们可以使用模运算来移动下标。例如,我们可以使用%来取下标值的余数。
使用这些小技巧,我们可以更加轻松地移动下标,从而减少出错的几率。
四、结语
动态规划算法是一种强大的算法设计范式,它可以解决许多复杂的问题。通过学习这两题,我们不仅掌握了动态规划算法的基本思想和技巧,还学会了移动下标的小技巧。希望这些知识能够对您有所帮助,让您在解决动态规划问题时更加游刃有余。