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

代码随想录算法训练营二十九天|动态规划part02

LeetCode 62 不同路径

题目链接:62. 不同路径 - 力扣(LeetCode)

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

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

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

示例 1:


输入:m = 3, n = 7
输出:28
示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
示例 3:

输入:m = 7, n = 3
输出:28
示例 4:

输入:m = 3, n = 3
输出:6

1.确定dp数组以及下标的含义:dp[i][j]表示到达坐标为(i,j)的点的不同路径数目,我们需要求dp[m-1][n-1]。

2.确定递推公式:因为机器人每次只能向下或者向右移动,所以dp[i][j]=dp[i-1][j]+dp[i][j-1]。

3.dp数组如何初始化:因为机器人只能向右或向下移动,所以对于第一行和第一列的各点,都只能有一条路径,所以初始化:

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

4.确定遍历顺序:按行优先遍历。

5.举例推导dp数组:

代码如下: 

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 j=1;j<n;j++)dp[0][j]=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

题目链接:63. 不同路径 II - 力扣(LeetCode)

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

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

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

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

示例 1:


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


输入:obstacleGrid = [[0,1],[0,0]]
输出:1

本题和上一题dp数组定义和上一题一样。

递推公式也和上一题一样,只是遇到障碍物时dp赋值为0。

初始化:因为机器人只能向右或向下走,所以如果第一行或第一列中有一个障碍物,那么这一行或这一列之后的所有点都不可达,如图所示:

所以初始化如下:

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

整体代码如下: 

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m=obstacleGrid.length;int n=obstacleGrid[0].length;int[][] dp=new int[m][n];for(int i=0;i<m;i++){if(obstacleGrid[i][0]==1)break;else dp[i][0]=1;}for(int j=0;j<n;j++){if(obstacleGrid[0][j]==1)break;else 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 整数拆分

题目链接:343. 整数拆分 - 力扣(LeetCode)

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

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

示例 1:

输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:

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

1.确定dp数组以及下标的含义:dp[i]表示正整数i拆分为k个正整数,这些整数的最大乘积。

2.确定递推公式:

对于数字i,我们可以选择:

直接拆分成j和i-j,乘积为j*(i-j);

拆分成j和进一步拆分的i-j,乘积为j*dp[i-j]。

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

3.dp数组如何初始化:初始化dp[2]=1。

4.确定遍历顺序:i从前向后遍历。

5.举例推导dp数组:举例n=10时:

代码如下: 

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],dp[i-j]*j);dp[i]=Math.max(dp[i],(i-j)*j);}}return dp[n];}
}

LeetCode 96 不同的二叉搜索树

题目链接:96. 不同的二叉搜索树 - 力扣(LeetCode)

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

示例 1:


输入:n = 3
输出:5
示例 2:

输入:n = 1
输出:1

1.确定dp数组以及下标的含义:dp[i]表示i个节点可以组成的互不相同的二叉搜索树个数。

2.确定递推公式:假设当前有i个节点,选j(1<=j<=i)作为根节点,所以1~j-1就是左子树上的节点,j+1~i就是右子树上的节点,所以左子树有dp[j-1]种,右子树有dp[i-j]种,所以以j为根节点的树有(dp[j-1]*dp[i-j])种。j可以取1~i,所以递推公式为:dp[i]=\sum_{j=1}^{i}dp[j-1]*dp[i-j]

3.dp数组如何初始化:当有0个或1个节点,只有一种,所以dp[0]=dp[1]=1。

4.确定遍历顺序:从前向后遍历

5.举例推导dp数组:举例n=5时:

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[j-1]*dp[i-j];}}return dp[n];}
}

http://www.lryc.cn/news/602413.html

相关文章:

  • QML QtCharts 饼状图(PieSeries)
  • AI资讯日报 - 2025年07月28日
  • Vue3 学习教程,从入门到精通, Vue 3 表单语法知识点及案例详解(19)
  • MDM五十万台设备高并发场景解决方案【后台管理】
  • Django + Celery 详细解析:构建高效的异步任务队列
  • 负载均衡算法中的加权随机算法
  • 【pytest高阶】源码的走读方法及插件hook
  • 端到端的核心区别点
  • 标准SQL语句示例
  • 【力扣热题100】哈希——两数之和
  • 数据库概述(学习笔记)
  • 能源智跃:大模型破壁数据孤岛,铸就智能转型新范式
  • 腾讯云centos7使用docker部署生产环境中间件
  • 力扣 hot100 Day58
  • eclipse更改jdk环境和生成webservice客户端代码
  • STM32入门之DMA直接存储器存取
  • 雷达系统设计学习:自制6GHz FMCW Radar
  • 从单枪匹马到联盟共生:白钰玮的 IP 破局之路|创客匠人
  • 【智慧物联网平台】编译jar环境 Linux 系统Maven 安装——仙盟创梦IDE
  • 2025创始人IP如何破局?
  • 【智慧物联网平台】编译jar环境 Linux 系统编译IOT物联网——仙盟创梦IDE
  • 解构远程智能系统的视频能力链:从RTSP|RTMP协议接入到Unity3D头显呈现全流程指南
  • Ansible安装与入门
  • WPF,按钮透明背景实现MouseEnter
  • 【Linux】Ubuntu上安装.NET 9运行时与ASP.NET Core项目部署入门
  • C#/.NET/.NET Core技术前沿周刊 | 第 48 期(2025年7.21-7.27)
  • 1.gradle安装(mac)
  • 基于AFLFast的fuzz自动化漏洞挖掘(1)
  • 全新AI工具小程序源码 全开源
  • 时序数据库选型指南:工业大数据场景下基于Apache IoTDB技术价值与实践路径