Skip to content

Latest commit

 

History

History
 
 

Week_09

#学习笔记

##高级动态规划

###一、递归、分治、动态规划复习

动态规划:适合有重复子问题的情况,其思想为分治加上最优子结构,通常使用顺推形式进行动态递推。

动态规划/分治/递归的共性是:找到重复子问题。

差异性:动态规划需要找到最优子结构,并在中途淘汰次优解。

###二、进阶版动态规划 动态规划问题的复杂度来源是状态定义状态转移方程

  • 状态拥有更多维度(二维、三维或者更多,甚至需要压缩)。
  • 状态转移方程更加复杂。
  • 本质:内功、逻辑思维、数学。

###三、不同路径 II 的状态转移方程

状态表示:创建包含m行和n列的二维数组 dp,其中 dp[i][j] 表示从左上角到位置 (i, j) 的不同路径数。

边界情况:由于每步只能往下或往右,因此 dp 的第一行和第一列(指下标为0的行和列)的值为1或0。从左到右遍历第一行,如果没有障碍物,则对应的 dp 值为1,一旦遇到障碍物,则第一行从这个位置开始向右的全部元素对应的 dp 值都为0。从上到下遍历第一列,如果没有障碍物,则对应的 dp 值为1,一旦遇到障碍物,则第一列从这个位置开始向下的全部元素对应的 dp 值都为0。

状态转移方程:当 i > 0 且 j > 0 时,首先判断位置 (i, j) 是否为障碍物,如果为障碍物则 dp[i][j] = 0,如果不为障碍物则位置 (i, j) 可由位置 (i - 1, j) 下移一步到达或者由位置 (i, j - 1) 右移一步到达,因此 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

因此状态转移方程分解为如下两种情况,只适合于 i > 0 且 j > 0 的情况。

如果 obstacleGrid[i][j] == 1,则 dp[i][j] = 0。

如果 obstacleGrid[i][j] == 0,则 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

遍历整个网格之后,dp[m - 1][n - 1] 即为不同路径数。

##字符串算法

字符串匹配算法用于匹配模式在字符串中第一次出现的位置,其中字符串的长度是m,模式的长度是n,满足m>n。

暴力法的时间复杂度是O(mn)。

Rabin-Karp算法基于哈希实现,平均时间复杂度是O(m+n)。

Knuth-Morris-Pratt算法利用最大前缀信息,减少不必要的比较次数,时间复杂度是O(m+n)。