`

动态规划总结(二)

阅读更多
这篇文章介绍unique path等一系列的题目,它们属于二维动态规划的问题,之前一篇文章讲过最长公共子序列(LCS), 最长递增子序列(LIS), 最长非降子序列。有兴趣的可以看一下,这些都是经典的二维动规问题。

1,Unique Paths
给定一个m*n的矩阵,一个机器人在这个矩阵的左上方,它试图走到这个矩阵的右下方,规定机器人只能往右和往下两个方向走,问有多少种不同的路径。

我们把这个矩阵抽象成一个二维数组grid,机器人开始的位置就是grid[0][0],它可以往下走,也可以往右走,我们初始化数组让它的第0列和第0行的值都1,因为机器人到这些地方只有一条路。对于其它的地方grid[i][j] = grid[i-1][j] + grid[i][j-1],因为到达(i, j)点必须经过(i, j-1)和(i, j-1),这样递推式就写出来了。代码如下:
public class Solution {
    public int uniquePaths(int m, int n) {
        int[][] result = new int[m][n];
        for(int i = 0; i < m; i++) {
            result[i][0] = 1;
        }
        for(int j = 0; j < n; j ++) {
            result[0][j] = 1;
        }
        
        for(int i = 1; i < m; i++) 
            for(int j = 1; j < n; j++) {
                result[i][j] = result[i-1][j] + result[i][j-1];
            }
        return result[m-1][n-1];
    }
}


2,Unique Paths II
给定一个二维数组,里面的值都是0或1,0代表可以到达,1代表不可以到达。其他规则和上题一样,问有多少种不同的方法。

唯一不同的就是多了障碍物,如果要走到终点,必须要绕过障碍物,换句话说有障碍物的点的值都为0。还要值得注意的是在第0列和第0行中,如果有障碍物,那么障碍物后面的路都是不通的,都要设置为0。代码如下:
public class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++) {
                if(obstacleGrid[i][j] == 1) obstacleGrid[i][j] = 0;
                else if(i == 0 && j == 0) obstacleGrid[i][j] = 1;
                else if(i == 0) obstacleGrid[0][j] = obstacleGrid[0][j-1];
                else if(j == 0) obstacleGrid[i][0] = obstacleGrid[i-1][0];
                else obstacleGrid[i][j] = obstacleGrid[i-1][j] + obstacleGrid[i][j-1];
            }
        return obstacleGrid[m-1][n-1];
    }
}


3,Minimum Path Sum
给定一个m*n的矩阵,里面包含着非负整数,从左上方到右下方,找出最小带权路径。

这是第一题的变形,在初始化第0列的时候 grid[i][0] += grid[i-1][0]; 第0行的初始化为grid[0][i] += grid[0][i-1]; 第(i,j)点的值我们仅需要去一个最小的就可以了,grid[i][j] = Math.min(grid[i-1][j], grid[i][j-1]) + grid[i][j]  (i>=1, j>=1)。代码如下:
public class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        for(int i = 1; i < m; i++) {
            grid[i][0] += grid[i-1][0];
        }
        for(int i = 1; i < n; i++) {
            grid[0][i] += grid[0][i-1];
        }
        
        for(int i = 1; i < m; i++)
            for(int j = 1; j < n; j++) {
                grid[i][j] = Math.min(grid[i-1][j], grid[i][j-1]) + grid[i][j];
            }
        return grid[m-1][n-1];
    }
}
分享到:
评论

相关推荐

    算法动态规划总结(拓展篇)

    从给定的文件标题“算法动态规划总结(拓展篇)”和描述“算法动态规划拓展总结,内含详细解说和代码”中,我们可以提炼出一系列关于动态规划算法的知识点,这些知识点涵盖了动态规划的多种应用及其优化技术。...

    算法动态规划总结(基础篇)

    ### 动态规划基础总结 #### 一、概述 动态规划是一种解决最优化问题的方法,其核心思想是将原问题分解成互相重叠的子问题集合,并存储子问题的解来避免重复计算,最终达到求解原问题的目的。本文将对计算机算法中...

    动态规划总结.doc

    动态规划是一种解决问题的有效方法,尤其在处理具有重叠子问题和最优子结构的复杂问题时。在算法分析与设计中,动态规划算法扮演着至关重要的角色。以下是对动态规划算法的详细阐述,以及如何应用于矩阵连乘问题。 ...

    动态规划 资料 动态规划总结

    本资料主要对动态规划进行了全面的总结,旨在帮助读者深入理解和掌握这一概念。 一、动态规划基础 动态规划的核心是将一个复杂的问题分解为多个相互关联的子问题,然后通过解决这些子问题来求解原问题。它与分治法...

    动态规划实验报告

    本实验报告主要探讨了使用动态规划算法解决计算二项式系数的问题。实验者刘春云,专业为软件工程,通过这个实验学习并应用了动态规划这一核心的计算机科学概念。实验指导教师为赵晓平,实验时间为2012年2月21日。 *...

    动态规划总结

    ### 动态规划总结 #### 1. 按状态类型分类 动态规划问题的核心在于定义合适的状态,根据状态的不同可以将动态规划分为不同的类别。这些分类有助于我们更好地理解和解决问题。 ##### 1.1 编号(长度)动态规划 这...

    动态规划题目总结。。。。

    【动态规划】是一种在计算机科学和数学中广泛使用的算法设计技术,主要应用于解决最优化问题。动态规划通过将复杂问题分解成子问题,并利用子问题的最优解来构造原问题的最优解,从而达到解决问题的目的。它的一个...

    ACM动态规划总结

    动态规划是一种在计算机科学中广泛使用的算法设计策略,特别是在解决最优化问题时。它通过将一个大问题分解成若干小的子问题,并利用...通过不断练习和总结,参赛者能够更好地掌握动态规划的技巧,提高编程竞赛的成绩。

    动态规划算法笔记总结ZIP分享

    动态规划的解决方案通常采用一个二维数组,其中每一行代表一个物品,每一列代表当前考虑的总重量。数组中的每个元素表示在考虑前i个物品且背包容量为j时能获得的最大价值。 完全背包问题与0-1背包问题类似,但允许...

    acm动态规划总结

    动态规划是一种算法思想,主要用来解决具有重叠子问题和最优子结构特性的问题。在ACM竞赛中,动态规划题目是竞赛的核心部分之一,掌握动态规划是解决算法难题的重要技能。在学习动态规划时,常见的题型包括路径计数...

    《动态规划算法实验》实验报告.docx

    《动态规划算法实验》实验报告主要探讨了两个经典动态规划问题——0-1背包问题和合唱队形安排问题。这两个问题都是在优化决策过程中寻找最优解的经典实例。 **一、0-1背包问题** 0-1背包问题是一个经典的约束优化...

    动态规划总结-by Amber.doc

    总结来说,动态规划是一个强大的工具,它能够处理具有重叠子问题和最优子结构的复杂问题。通过对不同状态类型的深入理解和实践,我们可以解决各种各样的问题,从经典的最短路径、最长公共子序列到更复杂的树型结构...

    动态规划总结与题目分类

    动态规划总结与题目分类 一、简单基础dp 1、递推: 2、背包 3、LIS 4、LCS 二、区间dp 四、数位dp 五、概率(期望) dp 六、状态压缩dp 七、数据结构优化的dp 1、二进制优化 2、单调队列优化 3、斜率优化 4、四边形...

    NOIP数学与动态规划-2020.08.18(B).pdf

    本资源摘要信息涵盖了 NOIP 数学与动态规划的所有方面,包括基础知识、动态规划专题、NOIP 动态规划总结、ACM 动态规划总结、Scratch 创意编程班和人工智能中小学系列课程等,旨在帮助读者快速了解 NOIP 数学与动态...

    zju动态规划试题选集

    总结来说,“zju动态规划试题选集”是一个非常宝贵的资源,对于想要深入理解和应用动态规划的人来说,这是一个不可多得的学习材料。通过这个选集,你可以系统地学习和实践动态规划,从而在编程竞赛和实际工作中更好...

    南京邮电大学 算法设计与分析 陈慧南 实验二动态规划法实验报告

    总结来说,动态规划法是一种解决最优化问题的重要算法思想,它通过构建多维数组,将问题分解为规模更小的子问题,并利用子问题的解来构建原问题的最优解。通过南京邮电大学的算法设计与分析课程的实验二,学生可以...

    近似串匹配的动态规划算法

    总结一下,近似串匹配的动态规划算法是一种高效的方法,通过Levenshtein距离或Hamming距离量化字符串间的相似度。动态规划策略能有效地计算出字符串之间的最小编辑距离,帮助我们在大量文本中快速找到相似子串。...

    acm 动态规划总结,关于背包问题

    这是一个典型的二维动态规划问题。我们自底向上构建一个二维数组number,其中number[i][j]表示到达第i层第j个节点的最大路径和。核心代码中的动态规划更新公式是: ```java number[i][j] = Math.max(number[i+1][j]...

Global site tag (gtag.js) - Google Analytics