`

动态规划总结(二)

阅读更多
这篇文章介绍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];
    }
}
分享到:
评论

相关推荐

    动态规划总结与题目分类

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

    动态规划32讲(十分好的资料)

    一共有32讲,并且有动态规划状态转移方程的总结。 第一节 动态规划基本概念 第二节 动态规划分类讨论 动态规划入门3 动态规划入门4 动态规划入门5 动态规划入门6 动态规划入门7 动态规划入门8……

    动态规划算法 DP

    基本动态规划算法总结 最长子序列探索 (最长非降子序列 + 最长公共子序列 最优路径搜索 ( 点数值三角形的最优路径搜索 +边数值矩形的最优路径搜索) 装载问题 0−1背包问题 二维0−1背包问题 插入乘号问题

    动态规划的算法

    4、总结一下你知道的可以用动态规划求解的问题,简要说明每个问题递归的子问题空间。 问题1、火柴棍游戏:2堆火柴棍,2人轮流拿。拿的规则如下:1、每次至少拿一根;2、只能从一堆里拿;3、第一堆火柴棍最多拿3根;4...

    leetcode动态规划总结-leetcode-summary-c-plus-plus:LeetCode问题总结

    leetcode动态规划总结Leetcode 总结 C++ 用 C++ 编写的 LeetCode 问题摘要。 请查看更多信息。 对于 Python 版本,请检查 . 对于 Java 版本,请检查 . 带*号的题号,表示本题与原题不同。 基本数据结构 - 广度优先...

    动态规划笔记

    昨天在牛客网上做笔试题,碰到了一道题动态规划做了一晚上都没做出来,最后看着别人的答案才勉强做出来,太菜了,今天总结一下。 动态规划思路: 1、找到状态和选择,确定当前状态和转换 2、明确dp数组/或函数的定义...

    常见算法小结(DP、动态规划、最长子序列、DFS、BFS等常见基础算法小集)

    本资源主要是汇集了自己刷题时总结下来的一些经典题目:包括二分、字符串替换、DP问题、动态规划、最长子序列、DFS、BFS、回溯算法等,旨在记录和查看复习,为了不断提升,不断更新补充。也包括链表的一些基础,有...

    剑指offer第二到八章代码java实现

    在第五章中更是对动态规划常见的一些体型进行了总结整理,包括“最长公共子序列,最长公共子串,背包,最大子数组和”;最后summary总结整理了链表常见的问题包括“链表是否有环,链表环的入口,是否相交,排序等”...

    算法数据结构学习视频教程,算法和数据结构的基础概念、进阶技巧以及特定算法的应用和实现

    第20节 暴力递归到动态规划(二).mp4 第21节 暴力递归到动态规划(三).mp4 第22节 暴力递归到动态规划(四).mp4 第23节 暴力递归到动态规划(五).mp4 第24节 暴力递归到动态规划(六).mp4 共48节课

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    算法设计技巧10.1 贪婪算法10.1.1 一个简单的调度问题10.1.2 Huffman编码10.1.3 近似装箱问题10.2 分治算法10.2.1 分治算法的运行时间10.2.2 最近点问题10.2.3 选择问题10.2.4 一些运算问题的理论改进10.3 动态规划...

    常用数学模型及其算法

    4第四章 动态规划 5第五章 图与网络 6第六章 排队论 7第七章 对策论 8第八章 层次分析法 9第九章 插值与拟合 10第十章 数据的统计描述和分析 11第十一章 方差分析 12第十二章 回归分析 13第十三章 微分方程建模 ...

    两年ACM竞赛所有算法总结.docx

    两年ACM竞赛所有算法总结,这里包含最短路、最小生成树、动态规划、字符串匹配、博弈、大数、Hash、排序、二分匹配、并查集、最大流、欧拉函数、扩展欧几里得等

    VMProtect的逆向分析和静态还原

    详细介绍了VMProtect的特点,同时讲解了vmp的逆向分析和静态还原点。...(五)转换汇编指令——动态规划 (六)寄存器染色 基本块内的寄存器轮转 基本块间的寄存器轮转 寄存器的二义性问题 识别寄存器的二义性的步骤

    十五个经典算法研究与总结、目录+索引(by_....rar

    经典算法,让你沉醉其中无法自拔。 一、A*搜索算法 一(续)、A*,Dijkstra,BFS 算法性能比较及 A*算法的应用 二、Dijkstra 算法初探 二(续)、彻底理解 Dijkstra 算法 二(再续)、Dijkstra 算法...三、动态规划算法

    经典微立体年终工作总结PPT模板

    PowerPoint模板内容页,由62张蓝色动态微立体幻灯片图表制作。图表类型丰富,框架完整,非常实用。 年终工作总结PPT目录: 一、工作回顾(近年来工作情况) 二、自我评价(对自己的看法) 三、工作体会(对工作的...

    18-总结.md

    - 三大算法思维:贪心,二分,动态规划 - 常见数据结构 ## 注意事项 - 算法,有难度,轻耐心学习 - 不仅关注题目本身,更要关注知识点和解题思路 - 按顺序学习(本章课程按顺序设计的) ## 看几个面试题 列举几...

    ACM比赛经验与常见问题对应的解题技巧总结

    在LeetCode等平台上,针对特定类型题目进行专题训练,例如,你可以专门花一段时间集中攻克动态规划的问题,然后转至图论相关题目,每个主题完成后都要梳理总结,整理成便于查阅的笔记。 二、比赛策略 题目分析的实际...

    leetcode中文版-leetcode:算法笔记总结。包括《剑指offer》《程序员笔试面试指南》《Leetcode》相关题目

    动态规划: 排序专题: 程序员代码面试指南 : chapter2 : 链表部分题目: LeetCode官方算法精选 初级算法49题: 数组系列: 字符串系列 链表系列 二叉树系列 排序系列 动态规划系列 设计系列 数学系列 其它系列 算法...

    算法和数据结构总结.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    数据结构与算法总结.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

Global site tag (gtag.js) - Google Analytics