当前位置:   article > 正文

算法修炼-动态规划之路径问题(1)

算法修炼-动态规划之路径问题(1)

62. 不同路径 - 力扣(LeetCode)

        思路:选定一个网格为终点,走到这个网格的所有走法就是这个网格的上面一个网格的所有走法加上这个网格左边一个网格的所有走法,然后做好初始化工作就行。 

  1. class Solution {
  2. public:
  3. int uniquePaths(int m, int n)
  4. {
  5. //dp表
  6. int arr[m][n];
  7. //特殊处理
  8. if(m == 1 || n == 1)
  9. return 1;
  10. //初始化
  11. for(int i = 0; i<m; i++)
  12. {
  13. arr[i][0] = 1;
  14. }
  15. for(int i = 0; i<n; i++)
  16. {
  17. arr[0][i] = 1;
  18. }
  19. //状态转移方程
  20. for(int i = 1; i<m; i++)
  21. {
  22. for(int j = 1; j<n; j++)
  23. {
  24. arr[i][j] = arr[i][j-1] + arr[i-1][j];
  25. }
  26. }
  27. return arr[m-1][n-1];
  28. }
  29. };

63. 不同路径 II - 力扣(LeetCode)

        思路: 这道题可以看做事上面那道题的升级版,我的思路就是先将创建出来的dp表先全部初始化为0,在状态转移方程中,如果遇到障碍物,就保持dp表中障碍物位置的值仍为0,其余位置的值为它的上面加上它的左边。这时有人可能就会有疑问了,如果一个位置的左边或者是上面为障碍物不影响赋值吗?答案是不影响的。因为障碍物位置的值就是0,加上跟没加没有区别,所以可以统一加上。

  1. class Solution {
  2. public:
  3. int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid)
  4. {
  5. //dp表
  6. int m = obstacleGrid.size();
  7. int n = obstacleGrid[0].size();
  8. vector<vector<int>> dp(m, vector<int>(n));
  9. //初始化
  10. for(int i = 0; i<n; i++)
  11. {
  12. if(obstacleGrid[0][i] == 0)
  13. dp[0][i] = 1;
  14. else
  15. break;
  16. }
  17. for(int i = 0; i<m; i++)
  18. {
  19. if(obstacleGrid[i][0] == 0)
  20. dp[i][0] = 1;
  21. else
  22. break;
  23. }
  24. //状态转移方程
  25. for(int i= 1; i<m; i++)
  26. {
  27. for(int j = 1; j<n; j++)
  28. {
  29. if(obstacleGrid[i][j] != 1)
  30. dp[i][j] = dp[i-1][j] + dp[i][j-1];
  31. }
  32. }
  33. return dp[m-1][n-1];

LCR 166. 珠宝的最高价值 - 力扣(LeetCode)

         思路:这题采用的方法略微跟上面两题不同,这一题的dp表我多补了一行和一列,通过比较所在位置的上面一个位置和左边一个位置谁大,加上值大的那个位置,只不过这种方法要注意两个表之间下标的对应关系。

  1. class Solution {
  2. public:
  3. int jewelleryValue(vector<vector<int>>& frame)
  4. {
  5. //dp表
  6. int m = frame.size();
  7. int n = frame[0].size();
  8. vector<vector<int>> dp(m+1, vector<int>(n+1));
  9. //初始化+状态转移方程
  10. for(int i = 1; i<=m ;i++)
  11. {
  12. for(int j = 1; j<=n; j++)
  13. {
  14. if(dp[i-1][j] < dp[i][j-1])
  15. {
  16. dp[i][j] += frame[i-1][j-1]+dp[i][j-1];
  17. }
  18. else
  19. {
  20. dp[i][j] += frame[i-1][j-1] + dp[i-1][j];
  21. }
  22. }
  23. }
  24. return dp[m][n];
  25. }
  26. };

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号