当前位置: 首页 > news >正文

代码随想录Day29

Day29

动态规划part02

LeetCode 62.不同路径

题目描述

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

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

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

示例

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

题目链接

https://leetcode.cn/problems/unique-paths/

思路
  1. dp数组及下标含义

dp[i][j], 走到第i行第j列处的路径条数

  1. 递推公式
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
  1. 初始化

第一行和第一列都只有一种方式抵达

解决代码
class Solution {
    public int uniquePaths(int m, int n) {
        //dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
        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];
    }
}

LeetCode 63. 不同路径 II

题目描述

给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。

网格中的障碍物和空位置分别用 10 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。

返回机器人能够到达右下角的不同路径数量。

测试用例保证答案小于等于 2 * 109

示例

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

题目链接

https://leetcode.cn/problems/unique-paths-ii/description/

思路
  1. dp数组及下标含义

dp[i][j], 走到第i行第j列处的路径条数

  1. 递推公式
if (obstacleGrid[i][j] == 1)
    dp[i][j] = 0;
else
    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
  1. 初始化

第一行和第一列都只有一种方式抵达且遇到有障碍, 之后的都无法抵达

解决代码
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length, n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) {
            if (obstacleGrid[i][0] == 1)
                break;
            dp[i][0] = 1;
        }
        for (int j = 0; j < n; j++) {
            if (obstacleGrid[0][j] == 1)
                break;
            dp[0][j] = 1;
        }
        for (int i = 1; i < m; i++)
            for (int j = 1; j < n; j++) {
                if (obstacleGrid[i][j] == 1)
                    dp[i][j] = 0;
                else
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        return dp[m - 1][n - 1];
    }
}

LeetCode 343.整数拆分

题目描述

给定一个正整数 n ,将其拆分为 k正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积

示例

输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

题目链接

https://leetcode.cn/problems/integer-break/

思路
  1. dp数组及下标含义

拆分n所能获得的最大乘积

  1. 递推公式
dp[i] = Math.max(dp[i], Math.max(j * dp[i - j], j * (i - j)))
//i为需要被拆分的数, j为当前拆分大小
  1. 初始化

2只能拆分为1 + 1, 所以dp[2] = 1; 小于2的情况没有意义

解决代码
class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n + 1];
        dp[2] = 1;
        for (int i = 3; i <= n; i++)
            for (int j = 1; j < i; j++) {
                dp[i] = Math.max(dp[i], Math.max(dp[i - j] * j, j * (i - j)));
        }
        return dp[n];
    }
}

LeetCode 96.不同的二叉搜索树

题目描述

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例

输入:n = 3
输出:5

题目链接

https://leetcode.cn/problems/unique-binary-search-trees/submissions/617446590/

思路
  1. dp数组及下标含义

节点值从 1n 互不相同的 二叉搜索树的个数

  1. 递推公式

根节点为1, 则共有 dp[0] * dp[n - 1]种

根节点为2, 则有dp[1] * dp[n - 2]种

所以dp[n] += dp[j - 1] * dp[n - j];

n为总节点个数

j∈[1, n]

dp[j - 1] :左子树为j - 1个节点的二叉搜索树个数

dp[n - j]:右子树为n - j个节点的二叉搜索树个数

  1. 初始化

dp[0] = 1, dp[1] = 1

解决代码
class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= n; i++)
            for (int j = 1; j <= i; j++) {
                dp[i] += dp[i - j] * dp[j - 1];
            }
        return dp[n];
    }
}

相关文章:

  • 学以致用,基于OpenCV的公摊面积估算程序
  • 探秘DeepSeek:开源AI领域的创新先锋
  • 从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.1.3分布式数据加载与并行处理(PyTorch DataLoader优化)
  • 让古籍“活”起来!PDF Craft如何用AI还原电子书灵魂?
  • Qt5.14.2+Cmake使用mingw64位编译opencv4.5成功图文教程
  • 基于python开发的邮箱合并群发工具
  • 5分钟快速手搓mcp发送邮件的server接入到cherrystudio
  • MapReduce工作原理详解
  • Mapbox-GL 事件体系和使用方法的详细讲解
  • [动规19] 最大子数组和
  • Mentalab Explore Pro携手 Wearanize + 数据集,推动睡眠科学研究
  • 每日一题-力扣-2278. 字母在字符串中的百分比 0331
  • Java EE(19)——网络原理——应用层HTTPS协议
  • 视觉语言,轻量且开源-Gemma 3
  • nut-ui下拉选的实现方式:nut-menu
  • 快速入手-基于Django-rest-framework的第三方认证插件(SimpleJWT)权限认证扩展返回用户等其他信息(十一)
  • 闭包与作用域的理解
  • Linux操作系统下离线安装nginx
  • 嵌入式学习第三十天--队列
  • 【区块链安全 | 第二十篇】类型之运算符
  • 徐汇建设机械网站/推广资讯
  • 免备案自助建站网站/优化网站平台
  • 怎么制作网站链接转发视频/fifa最新排名出炉
  • 胶南网/滨州seo排名
  • 做网站的公司有哪些岗位/广告推广方式
  • 大连网站建设/佛山网站建设公司哪家好