博客
关于我
Leetcode-最短路径和+最大子串和(动态规划)
阅读量:86 次
发布时间:2019-02-26

本文共 1618 字,大约阅读时间需要 5 分钟。

解决方案

这个问题可以分为两个部分解决:寻找网格中从左上角到右下角的最小路径和,以及找出数组中的最大子串和。

1. 网格中的最小路径和

我们使用动态规划来解决网格问题。每个点的最短路径和只能来自于左边或上方,因此我们创建一个二维数组dp来记录每个点的最短路径和。

  • 初始化:dp[0][0]为网格顶点的值。
  • 边界处理:
    • 左边界(i=0,j>0):dp[0][j] = dp[0][j-1] + grid[0][j]
    • 上边界(i>0,j=0):dp[i][0] = dp[i-1][0] + grid[i][0]
  • 中间点(i>0,j>0):dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]

最后,dp[m-1][n-1]即为右下角的最小路径和。

2. 数组中的最大子串和

同样使用动态规划:

  • 初始化:maxansmax都为数组的第一个元素。
  • 遍历数组:每一步计算当前子串和,更新最大值。
  • max是当前子串和与单独当前元素的最大值。
  • maxans是遍历过程中的最大值。

代码实现

public class Solution {    public int minPathSum(int[][] grid) {        int m = grid.length;        if (m == 0) return 0;        int n = grid[0].length;        int[][] dp = new int[m][n];                dp[0][0] = grid[0][0];        for (int i = 0; i < m; i++) {            for (int j = 0; j < n; j++) {                if (i == 0 && j == 0) continue;                if (i == 0) {                    dp[i][j] = dp[i][j - 1] + grid[i][j];                } else if (j == 0) {                    dp[i][j] = dp[i - 1][j] + grid[i][j];                } else {                    dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];                }            }        }        return dp[m - 1][n - 1];    }        public static int maxSubArray(int[] nums) {        if (nums.length == 0) return 0;        int maxans = nums[0];        int max = nums[0];        for (int i = 1; i < nums.length; i++) {            max = Math.max(nums[i], max + nums[i]);            maxans = Math.max(maxans, max);        }        return maxans;    }}

总结

  • 网格问题:通过动态规划填充dp数组,处理每个点的上下左右情况,最后返回右下角的值。
  • 最大子串和:同样使用动态规划,记录当前子串和和最大值,确保每一步都取最优解。

这两个算法分别解决了两个不同的问题,展示了动态规划在不同场景中的应用。

转载地址:http://nlyk.baihongyu.com/

你可能感兴趣的文章
opencv26-模板匹配
查看>>
opencv27-轮廓发现
查看>>
opencv28-凸包
查看>>
opencv29-轮廓周围绘制矩形框和圆形框
查看>>
OpenCV3 install tutorial for Mac
查看>>
opencv3-Mat对象
查看>>
opencv30-图像矩
查看>>
opencv32-基于距离变换和分水岭的图像分割
查看>>
opencv4-图像操作
查看>>
opencv5-图像混合
查看>>
opencv6-调整图像亮度和对比度
查看>>
opencv7-绘制形状和文字
查看>>
opencv8-图像模糊
查看>>
opencv9-膨胀和腐蚀
查看>>
OpenCV_ cv2.imshow()
查看>>
opencv_core.dir/objects.a(vs_version.rc.obj)‘ is incompatible with i386:x86-64 output
查看>>
opencv——图像缩放1(resize)
查看>>
opencv——最简单的视频读取
查看>>
Opencv——模块介绍
查看>>
OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?
查看>>