刷题记录——动态规划,最短路径问题

作者:不如打代码KK
关键词:二维矩阵,最短路径,动态规划

动态规划——最短路径问题

1.动态规划概念和思想

    动态规划过程是:把原问题划分成多个“阶段”,依次来做“决策”,得到当前的局部解;每次决策,会依赖于当前“状态”,而且会随即引起状态的转移。
    这样,一个决策序列就是在变化的状态中,“动态”产生出来的,这种多阶段的、最优化决策,解决问题的过程就称为动态规划(Dynamic Programming,DP)。
   基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一个子问题的解,会为后一子问题的求解,提供有用的信息。
   在求解一个子问题的时候,我们会列出、所有可能的局部解,通过“决策”,保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决每个子问题,最后一个子问题,也就是最后一个阶段的问题,那就是初始问题的解。
由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
   与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的。
   动态规划通常用来求解最优化问题。
   这类问题可以有很多可行解,每个解都对应一个值,我们希望找到具有最优值(最大或最小)的解。

2.问题描述

给定一个包含非负整数的 m x n 举证matrix,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

3.代码实现

如有问题请评论,看到后会帮忙解答。

   @Test
    public void test11() {
        int[][] matrix = new int[][]{
                {0, 3, 1, 8, 1},
                {1, 1, 8, 0, 1},
                {0, 5, 1, 9, 1},
                {8, 2, 1, 4, 1},
                {0, 1, 1, 0, 1}};
        Assert.assertTrue(getMinPathSum(matrix) == 10);
    }


    public int getMinPathSum(int[][] matrix) {
        int r = matrix.length;
        int l = matrix[0].length;

        int[][] dp = new int[r][l];
        dp[0][0] = matrix[0][0];
        //第一行
        for (int i = 1; i < l; i++) {
            dp[0][i] = dp[0][i-1] + matrix[0][i];
        }
        //第一列
        for (int i = 1; i < r; i++) {
            dp[i][0] = dp[i-1][0] + matrix[i][0];
        }
        //遍历每一个元素
        for (int i = 1; i < r; i++) {
            for (int j = 1; j < l; j++) {
                int temp1 = dp[i-1][j]+matrix[i][j];
                int temp2 = dp[i][j-1]+matrix[i][j];
                dp[i][j]= temp1 < temp2 ? temp1 : temp2;
            }
        }

        return dp[r-1][l-1];

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值