动态规划

 

大佬题解:动态规划(妈妈以后再也不怕我遇见动态规划了)

看过大佬的题解之后,感觉动态规划没有那么可怕了

动态规划常规步骤:

单个数组或者字符串要用动态规划时,可以把动态规划 dp[i] 定义为 nums[0:i] 中想要求的结果;当两个数组或者字符串要用动态规划时,可以把动态规划定义成两维的 dp[i][j] ,其含义是在 A[0:i] 与 B[0:j] 之间匹配得到的想要的结果。

1、状态定义,本题dp[i][j]可以定义为text[i-1]、text[j-1],因为要考虑字符串i,j为0的情况

2、状态转移方程,当text1 [i-1] ==  text2 [j-1]时,两个字符串的最后一位相等,那么最长子序列加1,dp[i][j] = dp[i - 1][j - 1] + 1

        ,当text1 [i-1] !=  text2 [j-1]时,两个字符串的最后一位不等,那么dp[i][j] 应该是 dp[i - 1][j] 和 dp[i][j - 1] 的最大值,

        综上,状态转移方程为:

                dp[i][j]=dp[i−1][j−1]+1, 当 text1[i - 1] == text2[j - 1];text1[i−1]==text2[j−1];

                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])dp[i][j]=max(dp[i−1][j],dp[i][j−1]), 当 text1[i - 1] != text2[j - 1]text1[i−1]!=text2[j−1]

3、状态初始化,当 i 或 j 为0时,表示空字符串,初始化为0,则当i  或 j  为 0时,d[i][j] 为0,

4、遍历方向和范围,由于 dp[ i ][ j ] 依赖与 dp[i - 1][ j - 1] , dp[i - 1] [ j ], dp[ i ][ j - 1],所以 i 和 j 的遍历顺序肯定是从小到大的。
另外,由于当 i 和 j 取值为 0 的时候,dp[ i ][ j  ] = 0,而 dp 数组本身初始化就是为 0,所以,直接让 i 和 j 从 1 开始遍历。遍历的结束应该是字符串的长度为 len(text1)len(text1) 和 len(text2)len(text2)。、

5、返回结果

  dp[ i ] [ j ] 表示text1[0:i-1] 和 text2[0:j-1] 的最长公共子序列,所以最后返回的结果应该是 i = len(text1) 、j = len( text2)时的dp值。

 

 

作者:fuxuemingzhu

链接:https://leetcode-cn.com/problems/longest-common-subsequence/solution/fu-xue-ming-zhu-er-wei-dong-tai-gui-hua-r5ez6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2021-04-03 11:53  鼬神无悔  阅读(72)  评论(0)    收藏  举报