动态规划day.2

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 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 109

 思路

  1. 确定dp数组(dp table)以及下标的含义,因为题目是一个矩阵,因此我们需要定义一个二维的dp数组来记录每个方格的状态,dp数组的含义应该是从dp[0][0]位置走到dp[n][m]位置总共有多少种方法
  2. 确定递推公式,因此我们机器人行走只能由上往下走或者由左往右走,因此我们位置的上一个格子应该为dp[n-1][m],目标位置的左边的格子应该为dp[n][m-1],因此,我们就可以知道要达到我们的目标位置的方法为dp[n][m] = dp[n-1][m] + dp[n][m-1]
  3. dp数组如何初始化,根据我们的递推公式,我们可知我们的状态都是由上面和左面的方格推导得出的,因此我们需要初始化最上面的格子和最左面的格子,因此就可以知道dp[0][i]为1,并且dp[i][0]也为1,因为只能向下走或者向右走,因此到达同一行右边的所有格子只有一种方法,同理到达同一列下的所有格子也只有一种方法
  4. 确定遍历顺序,根据推导公式就可知,我们应该由上往下遍历,由左往右遍历
  5. 举例推导dp数组,查找debug

代码

int uniquePaths(int m, int n) {int dp[m][n];for(int i = 0; i < m ; i++)dp[i][0] = 1;for(int j = 0; 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];
}

63.不同路径II

链接:. - 力扣(LeetCode)

题目描述:

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

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

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

网格中的障碍物和空位置分别用 10 来表示。

示例 1:

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

示例 2:

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

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j]01

思路

  1. 确定dp数组(dp table)以及下标的含义为,题目是一个矩阵,因此我们需要定义一个二维的dp数组来记录每个方格的状态,dp数组的含义应该是从dp[0][0]位置走到dp[n][m]位置总共有多少种方法
  2. 确定递推公式,因此我们机器人行走只能由上往下走或者由左往右走,因此我们位置的上一个格子应该为dp[n-1][m],目标位置的左边的格子应该为dp[n][m-1],因此,我们就可以知道要达到我们的目标位置的方法为dp[n][m] = dp[n-1][m] + dp[n][m-1],因为本题中设置了障碍,因此我们在遇到障碍时不能继续行走,因此需要加上一个判断条件判断是否有障碍
  3. dp数组如何初始化,在本题中,根据我们的递推公式,我们可知我们的状态都是由上面和左面的方格推导得出的,因此我们需要初始化最上面的格子和最左面的格子,但是注意,如果出现了障碍,则代表我们走不到后面的位置,因此本题的初始化与上题不同,需要加上判断
  4. 确定遍历顺序,根据推导公式就可知,我们应该由上往下遍历,由左往右遍历
  5. 举例推导dp数组

代码

int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize) {int m = obstacleGridSize;int n = *obstacleGridColSize;// 如果起点或终点有障碍物,直接返回0if(obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1)return 0;int dp[m][n];memset(dp, 0, sizeof(dp)); // 初始化为0// 处理边界条件dp[0][0] = 1; // 起点for(int i = 1; i < m; i++) {if(obstacleGrid[i][0] == 0)dp[i][0] = dp[i-1][0];}for(int j = 1; j < n; j++) {if(obstacleGrid[0][j] == 0)dp[0][j] = dp[0][j-1];}// 计算路径数量for(int i = 1; i < m; i++) {for(int j = 1; j < n; j++) {if(obstacleGrid[i][j] == 0)dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[m-1][n-1];
}

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。

提示:

  • 2 <= n <= 58

 思路

  • 确定dp数组及下标含义:

    • 我们可以使用一个一维数组 dp,其中 dp[i] 表示正整数 i 拆分后可以获得的最大乘积。
  • 确定递推公式:

    • 当考虑拆分正整数 i 时,我们可以考虑将其拆分成两个正整数 ji-j,其中 1 <= j < i。这样,i 的拆分乘积可以表示为 j * (i-j)
    • 但是,j * (i-j) 并不一定是最优的,因为 j(i-j) 可能还可以继续拆分,因此我们需要比较 dp[j] * dp[i-j]j * (i-j),选择其中的最大值作为 dp[i] 的值。
    • 因此,递推公式为:dp[i] = max(dp[j] * dp[i-j], j * (i-j)),其中 1 <= j < i
  • dp数组初始化:

    • dp[0]dp[1] 都是0,因为它们都无法拆分成两个正整数的和。
    • dp[2] 为1,因为2只能拆分成1+1,乘积为1。
    • dp[3] 为2,因为3可以拆分成1+2,乘积为2。
    • 依次类推,初始化数组中的值。
  • 确定遍历顺序:

    • 我们需要先计算较小的正整数的最大乘积,然后依次向上计算较大的正整数的最大乘积,直到计算出目标正整数 n 的最大乘积。
  • 举例推导dp数组

代码

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

96.不同的二叉搜索树

链接:. - 力扣(LeetCode)

题目描述:

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

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

思路

由图可以知道,n为3的情况可以由n为2和n为1的情况推导出来

头节点为1 = 左子树0个节点 * 右子树2个节点

头节点为2 = 左子树1个节点 * 左子树1个节点

头节点为3 = 左子树2个节点 * 右子树0个节点

dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2]*dp[0]

  1. 确定dp数组(dp table)以及下标的含义,dp[i]为i值有dp[i]种二叉搜索树
  2. 确定递推公式,dp[i] += dp[j-1] * dp[i-j],j代表左子树的情况
  3. dp数组如何初始化,dp[0]代表空二叉树,也满足条件,因此值应该为1
  4. 确定遍历顺序,根据递推公式,可知由小往大去遍历
  5. 举例推导dp数组

代码

int numTrees(int n) {int dp[n+1];memset(dp, 0, sizeof(dp));dp[0] = 1;for(int i = 1; i <= n ; i++){for(int j = 1; j <= i ; j++)dp[i] += dp[j-1] * dp[i-j];}return dp[n];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3022044.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Google Earth Engine谷歌地球引擎计算遥感影像在每个8天间隔内的多年平均值

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;求取多年时间中&#xff0c;遥感影像在每1个8天时间间隔内的多年平均值的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;系列教学文章…

【linux软件基础知识】-死锁问题

死锁问题 当两个或多个线程由于每个线程都在等待另一个线程持有的资源而无法继续时,就会发生死锁 如下图所示, 在线程 1 中,代码持有了 L1 上的锁,然后尝试获取 L2 上的锁。 在线程 2 中,代码持有了 L2 上的锁,然后尝试获取 L1 上的锁。 在这种情况下,线程 1 已获取 L…

CSS---Emmet(二)

一、Emmet语法 Emmet语法是一种用于快速编写HTML和CSS的缩写技术。它允许开发者通过简洁的表达式快速生成复杂的代码结构&#xff0c;极大地提高了编码效率。使用Emmet&#xff0c;你只需要写出一些简短的缩写符号和操作符&#xff0c;然后通过快捷键&#xff08;通常是Tab键&…

PPP点对点协议

概述 Point-to-Point Protocol&#xff0c;点到点协议&#xff0c;工作于数据链路层&#xff0c;在链路层上传输网络层协议前验证链路的对端&#xff0c;主要用于在全双工的同异步链路上进行点到点的数据传输。 PPP主要是用来通过拨号或专线方式在两个网络节点之间建立连接、…

C语言例题35、反向输出字符串(指针方式),例如:输入abcde,输出edcba

#include <stdio.h>void reverse(char *p) {int len 0;while (*p ! \0) { //取得字符串长度p;len;}while (len > 0) { //反向打印到终端printf("%c", *--p);len--;} }int main() {char s[255];printf("请输入一个字符串&#xff1a;");gets(s)…

泛型编程四:容器

文章目录 前言一、序列容器verctor 总结 前言 STL有六大部件&#xff0c;容器、算法、仿函数、迭代器、适配器和分配器。除了算法是函数模板&#xff0c;其他都是类模板。容器可以分为序列容器和关联容器。常见的序列容器有vector、array、deque、list、forward-list&#xff…

各种流量包特征

[CVE-2013-1966] Apache Struts2 远程命令执行漏洞 要执行的命令在exec里面&#xff0c;而且回显数据包里面有明显执行结果回显 [CVE-2017-8046] Spring Data Rest 远程命令执行漏洞 回显不明显&#xff0c;考试提供的解码工具不能解密&#xff0c; [CVE-2017-12149] JBOSS…

基于Springboot的校园健康驿站管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园健康驿站管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

【stm-4】PWM驱动LED呼吸灯 PWM驱动舵机PWM驱动直流电机

1.PWM驱动LED呼吸灯 void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); //结构体初始化输出比较单元 void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef*…

力扣HOT100 - 131. 分割回文串

解题思路&#xff1a; class Solution {List<List<String>> res new ArrayList<>();List<String> pathnew ArrayList<>();public List<List<String>> partition(String s) {backtrack(s,0);return res;}public void backtrack(Str…

创新指南|创新组合管理的7个陷阱以及如何避免它们

进入未知领域的第一步可能具有挑战性。尽管创新会犯错误&#xff0c;但在将 IPM 作为公司实践实施时&#xff0c;您可以准备好并避免一些常见的陷阱。在这篇文章中&#xff0c;我们将讨论组织在实施创新组合管理时遇到的最常见的陷阱。 01. 在映射中包含日常业务任务 映射中的…

Github的使用教程(下载和上传项目)

根据『教程』一看就懂&#xff01;Github基础教程_哔哩哔哩_bilibili 整理。 1.项目下载 1&#xff09;直接登录到源码链接页或者通过如下图的搜索 通过编程语言对搜索结果进一步筛选。 2&#xff09;红框区为项目的源代码&#xff0c;README.md &#xff08;markdown格式&…

威客网上招标系统(五)

目录 5 详细设计 5.1 系统首页 5.1.1系统首页&#xff08;网站首页index.jsp&#xff09; 5.1.2 下沙派威客网首页界面说明 5.2 站内新闻信息 5.2.1站内新闻操作界面 5.2.2系统主操作界面说明 5.3威客在线操作界面 5.3.1 威客在线操作界面 5.3.2威客在线说明 5.4系统…

Spring Task及订单状态定时处理

1&#xff1a;Spring Task概念&#xff1a; Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑 定时任务的理解 定时任务即系统在特定时间执行一段代码&#xff0c;它的场景应用非常广泛&#xff1a; 购买游戏的月卡会员后&a…

【吃透Java手写】2-Spring(下)-AOP-事务及传播原理

【吃透Java手写】Spring&#xff08;下&#xff09;AOP-事务及传播原理 6 AOP模拟实现6.1 AOP工作流程6.2 定义dao接口与实现类6.3 初始化后逻辑6.4 原生Spring的方法6.4.1 实现类6.4.2 定义通知类&#xff0c;定义切入点表达式、配置切面6.4.3 在配置类中进行Spring注解包扫描…

电-热耦合市场联合出清!考虑均衡约束的综合能源系统电-热分配方法程序代码!

前言 随着现代城市面临环境问题&#xff0c;原来燃煤的水和空间供暖设备已逐渐被电锅炉和热泵等电气设备所取代。此外&#xff0c;集中生产热能并通过管网分配热能的区域供暖系统&#xff0c;由于其更高的效率&#xff0c;在冬季漫长寒冷的国家和地区越来越受欢迎。供暖设备的…

搜狗输入法 PC端 v14.4.0.9307 去广告绿化版.

软件介绍 搜狗拼音输入法作为众多用户计算机配置的必备工具&#xff0c;其功能的全面性已为众所周知&#xff0c;并且以其高效便捷的输入体验受到广大使用者的青睐。然而&#xff0c;该软件在提供便利的同时&#xff0c;其内置的广告元素常常为用户带来一定的干扰。为此&#…

SlowFast报错:ValueError: too many values to unpack (expected 4)

SlowFast报错&#xff1a;ValueError: too many values to unpack (expected 4) 报错细节 File "/home/user/yuanjinmin/SlowFast/tools/visualization.py", line 81, in run_visualizationfor inputs, labels, _, meta in tqdm.tqdm(vis_loader): ValueError: too …

Eclipse下载安装教程(包含JDK安装)【保姆级教学】【2023.10月最新版】

目录 文章最后附下载链接 第一步&#xff1a;下载Eclipse&#xff0c;并安装 第二步&#xff1a;下载JDK&#xff0c;并安装 第三步&#xff1a;Java运行环境配置 安装Eclipse必须同时安装JDK &#xff01;&#xff01;&#xff01; 文章最后附下载链接 第一步&#xf…

J1019基于SpringBoot的护肤品推荐系统设计与实现(源码+包运行+技术指导)

项目描述 临近学期结束&#xff0c;开始毕业设计制作&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉的困难吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的护…