当前位置:   article > 正文

动态规划算法专题四--两个数组dp问题

动态规划算法专题四--两个数组dp问题

目录

题四十 最长公共子序列

 题四十一 不相交的线

 题四十二 不同子序列

 题四十三 通配符匹配


题四十 最长公共子序列

1143. 最长公共子序列 - 力扣(LeetCode)

题解:

状态方程:dp[i][j]:表示s1字符串[0,i]区间和s2字符串[0,j]区间,最长公共子序列。

根据方程进行推导:分两种情况讨论当s1[i] == s2[j] / s1[i] != s2[j]

  1. class Solution {
  2. public:
  3. int longestCommonSubsequence(string text1, string text2) {
  4. //1、创建dp表
  5. int n = text1.size();
  6. int m = text2.size();
  7. vector<vector<int>> dp(n+1, vector<int>(m+1));
  8. //2、初始化
  9. text1 = " " + text1;
  10. text2 = " " + text2;
  11. //3、填表
  12. for(int i = 1; i<n+1; ++i)
  13. {
  14. for(int j = 1; j<m+1; ++j)
  15. {
  16. if(text1[i] == text2[j])
  17. {
  18. dp[i][j] = dp[i-1][j-1] + 1;
  19. }
  20. else
  21. {
  22. dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
  23. }
  24. }
  25. }
  26. //返回值
  27. return dp[n][m];
  28. }
  29. };

 题四十一 不相交的线

1035. 不相交的线 - 力扣(LeetCode)

题解:

状态方程:dp[i][j]:nums1序列[0,i]区间和nums2序列[0,j]区间,有多少个不相交线。

根据方程进行推导:分两种情况讨论当s1[i] == s2[j] / s1[i] != s2[j]

  1. class Solution {
  2. public:
  3. int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
  4. //1、创建dp表
  5. int m = nums1.size();
  6. int n = nums2.size();
  7. vector<vector<int>> dp(m+1, vector<int> (n+1));
  8. //2、初始化
  9. //3、填表
  10. for(int i = 1; i<m+1; ++i)
  11. {
  12. for(int j = 1; j<n+1; ++j)
  13. {
  14. if(nums1[i-1] == nums2[j-1])
  15. {
  16. dp[i][j] = dp[i-1][j-1] + 1;
  17. }
  18. else
  19. {
  20. dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
  21. }
  22. }
  23. }
  24. //4、返回值
  25. return dp[m][n];
  26. }
  27. };

 题四十二 不同子序列

LCR 097. 不同的子序列 - 力扣(LeetCode)

题解:

dp[i][j]:表示[0,i]区间的s串,有多少个[0,j]区间的t串。

根据此状态方程推导。

  1. class Solution {
  2. public:
  3. int numDistinct(string s, string t) {
  4. //1、创建dp表
  5. int m = s.size();
  6. int n = t. size();
  7. vector<vector<double>> dp(m+1, vector<double> (n+1));
  8. //2、初始化
  9. for(int i = 0; i<m+1; ++i)
  10. {
  11. dp[i][0] = 1;
  12. }
  13. //3、填表
  14. for(int i = 1; i<m+1; ++i)
  15. {
  16. for(int j = 1; j<n+1; ++j)
  17. {
  18. dp[i][j] += dp[i-1][j];
  19. if(s[i-1] == t[j-1])
  20. {
  21. dp[i][j] += dp[i-1][j-1];
  22. }
  23. }
  24. }
  25. //4、返回值
  26. return dp[m][n];
  27. }
  28. };

 题四十三 通配符匹配

44. 通配符匹配 - 力扣(LeetCode)

题解:

dp[i][j]:表示[0,i]区间的s串,有多少个[0,j]区间的t串。

根据此状态方程推导。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/836992
推荐阅读
相关标签
  

闽ICP备14008679号