首页 > 其他分享 >day 38 62.不同路径 | 63. 不同路径 II | 343. 整数拆分

day 38 62.不同路径 | 63. 不同路径 II | 343. 整数拆分

时间:2023-04-07 12:22:56浏览次数:30  
标签:obstacleGrid int 路径 网格 II ++ 38 dp

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

 

  • 输入:m = 3, n = 7
  • 输出:28

想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。

此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。

那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。

 

class Solution {
    public int uniquePaths(int m, int n) {
     int[][] dp = new int[m][n];

        //初始化
        for (int i = 0; i < m; i++) {
            dp[i][0] = 1;
        }
        for (int i = 0; i < n; i++) {
            dp[0][i] = 1;
        }


        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        
        return dp[m - 1][n - 1];
    }
}

 

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

 

 

  • 输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
  • 输出:2 解释:
  • 3x3 网格的正中间有一个障碍物。
  • 从左上角到右下角一共有 2 条不同的路径:
  • 向右 -> 向右 -> 向下 -> 向下
  • 向下 -> 向下 -> 向右 -> 向
  1. 确定dp数组(dp table)以及下标的含义

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

  1. 确定递推公式

递推公式和62.不同路径一样,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

但这里需要注意一点,因为有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)。

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];
        if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
            return 0;
        }

        for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
            dp[i][0] = 1;
        }
        for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
            dp[0][j] = 1;
        }

          for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;
            }
        }
        return dp[m - 1][n - 1];

    }
}

 

 

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:

  • 输入: 2
  • 输出: 1
  • 解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:

  • 输入: 10
  • 输出: 36
  • 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
  • 说明: 你可以假设 n 不小于 2 且不大于 58。

j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了。那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));

也可以这么理解,j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘。

如果定义dp[i - j] * dp[j] 也是默认将一个数强制拆成4份以及4份以上了。

所以递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});

那么在取最大值的时候,为什么还要比较dp[i]呢?

因为在递推公式推导的过程中,每次计算dp[i],取最大的而已

 

class Solution {
    public int integerBreak(int n) {
        //dp[i] 为正整数 i 拆分后的结果的最大乘积
        int[] dp = new int[n+1];
        dp[2] = 1;
          for(int i = 3; i <= n; i++) {
            for(int j = 1; j <= i-j; j++) {
                // 这里的 j 其实最大值为 i-j,再大只不过是重复而已,
                //并且,在本题中,我们分析 dp[0], dp[1]都是无意义的,
                //j 最大到 i-j,就不会用到 dp[0]与dp[1]
                dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));
                // j * (i - j) 是单纯的把整数 i 拆分为两个数 也就是 i,i-j ,再相乘
                //而j * dp[i - j]是将 i 拆分成两个以及两个以上的个数,再相乘。
            }
        }
        return dp[n];
    }
}

 

标签:obstacleGrid,int,路径,网格,II,++,38,dp
From: https://www.cnblogs.com/libertylhy/p/17295755.html

相关文章

  • day 38代码随想录 509. 斐波那契数 | 使用最小花费爬楼梯
    斐波那契数,通常用 F(n)表示,形成的序列称为斐波那契数列。该数列由 0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1) =1F(n)=F(n-1)+F(n-2),其中n>1给你n,请计算F(n)。示例1:输入:2输出:1解释:F(2)=F(1)+F(0)=1+0=1因为......
  • HDU - 3338 Kakuro Extension(最大流 行列模型)
    题目大意:看一下图基本就知道了解题思路:难点是构图。。设置一个超级源点和所有的行的和相连,容量为该行的和-该行和由几个数相加得到,因为这里将0看成了,1看成了2,依此类推设置一个超级汇点,和所有列的和相连,容量为该列的和-该列和由几个数相加得到,和上面一样接着就是空白部分......
  • HDU - 3081 Marriage Match II(二分图最大匹配 + 并查集)
    题目大意:有n个男生n个女生,现在要求将所有的男女配对,所有的男女都配对的话,算该轮游戏结束了。接着另一轮游戏开始,还是男女配对,但是配对的男女不能是之前配对过的。问这游戏能玩多少轮男女能配对的条件如下1.男女未曾吵架过。2.如果两个女的是朋友,那么另一个女的男朋友可以和......
  • asciinema 方便的终端录屏方案
    asciinema方便的终端录屏方案,我们可以直接使用cli工具就可以方便的进行终端录制了,然后可以自己提供一份website基于官方提供的asciinema-player进行播放参考玩法  简单说明:我们可以基于s3以及asciinema提供的工具自己包装一个ui当然也可以直接使用官方提供的asci......
  • 改进蚁群算法 Dijkstra算法 遗传算法 人工势场法实现二维 三维空间路径规划
    【蚁群算法】改进蚁群算法Dijkstra算法遗传算法人工势场法实现二维三维空间路径规划本程序为蚁群算法+Dijkstra算法+MAKLINK图理论实现的二维空间路径规划算法实现:1)基于MAKLINK图理论生成地图,并对可行点进行划分;2)用Dijkstra算法实现次优路径的寻找;3)在Dijkstra算法的基......
  • postman安装报错System.IO.DirectoryNotFoundException: 未能找到路径
    报这个错误   解决方案:1.在C:\Users\Administrator\AppData\Local\Postman\packages目录下找到Postman-8.0.8-full.nupkg文件,更名为Postman-8.0.8-full.zip,并解压到当前文件夹,如下图:  2.删除桌面postman快捷图标,发送C:\Users\Administrator\AppData\Local\Postman......
  • C#路径(\;.\;..\;..\..\)测试笔记
    staticvoidMain(string[]args){/*文件路径分为绝对路径和相对路径。完整描述文件位置的路径就是绝对路径,相对于目标的位置就是相对路径。*绝对路径:是从盘符开始的路径,形如C:\windows\system32\cmd.exe*相对路......
  • 142. 环形链表 II
     解法一:①首先判断是否有环,若无环,则快指针或其下一指针指向空;若有环,则从快慢指针相遇的位置继续出发,直到再次相遇,遍历次数即为环长len。②两指针从头结点重新开始,让其中一指针先出发len步,而后另一指针再出发,相遇节点即为环起点。/***Definitionforsingly-linkedlist.*......
  • 剑指 Offer 14- II. 剪绳子 II
    题目链接:剑指Offer14-II.剪绳子II方法:数论解题思路将\(n\)分为\(m\)个数的和,使得这\(m\)个数的乘积最大,那么应该将\(m\)个数分为\(2\)和\(3\)的组合,尽可能为\(3\)。注意大数越界问题。代码classSolution{public:intcuttingRope(intn){......
  • 剑指 Offer 12. 矩阵中的路径
    题目链接:剑指Offer12.矩阵中的路径方法:DFS解题思路根据\(word\)中的第一个字母,从\(board\)网格中开始查找,通过\(DFS\)算法思想实现。注意:在每一轮开始查找前,每个位置的标记应该清除;每一个位置有上下左右四个方向可以选择;\(DFS\)查找进入下一步时要将位置标记......