动态规划经典例题leetcode思路代码详解

目录

动态规划基础篇例题

leetcode70题.爬楼梯

leetcode746题.使用最小花费爬楼梯

leetcode198题.打家劫舍

leetcode62题.不同路径

leetcode64题.最小路径和

leetcode63题.63不同路径II


动态规划基础篇例题

这一篇的例题解答是严格按照我上一篇写的动态规划三部曲做的,对动态规划不太了解或者比较感兴趣的朋友可以看我上一篇文章。

动态规划算法详解基础篇-CSDN博客

leetcode70题.爬楼梯

70. 爬楼梯 - 力扣(LeetCode)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45
class Solution {/*动态规划三部曲第一步:dp[i]数组含义:表示爬到第i个台阶时,一共有dp[i]种爬法。第二步:求关系时dp[i] dp[i-1] dp[i-2]要么是从i-1跳上来 要么就是从i-2跳上来的 dp[i] = dp[i-1] + dp[i-2];第三步:初始值dp[0] = 1;dp[1] = 1dp[2] = 2;*/public int climbStairs(int n) {if(n <= 1){return 1;}int[] dp = new int[n+1];dp[0] = 1;dp[1] = 1;for(int i = 2; i <= n; i++){dp[i] = dp[i-1] + dp[i-2];}return dp[n];}
}

leetcode746题.使用最小花费爬楼梯

746. 使用最小花费爬楼梯 - 力扣(LeetCode)

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例 1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

示例 2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

提示:

  • 2 <= cost.length <= 1000
  • 0 <= cost[i] <= 999
class Solution {/*动态规划三部曲:1、dp[i]:我们爬到第 i 层是,需要花费 dp[i] 元。2、求关系式要跳到 i 层,(1)要么从第 i-1 跳上来 dp[i] = dp[i-1] + cost[i](2)要么从第 i-2 跳上来 dp[i] = dp[i-2] + cost[i]。dp[i] = min(dp[i-1], dp[i-2]) + costfor(i = 2)3、初始值dp[0] = cost[0]dp[1] = cost[1]*/public int minCostClimbingStairs(int[] cost) {int n = cost.length;int[] dp = new int[n];dp[0] = cost[0];dp[1] = cost[1];for(int i = 2; i < n; i++){dp[i] = Math.min(dp[i-1], dp[i-2]) + cost[i];}return Math.min(dp[n-1], dp[n-2]);}
}

leetcode198题.打家劫舍

198. 打家劫舍 - 力扣(LeetCode)

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400
/*1、dp[i]:到达第i个房间时偷到的最高金额是dp[i]2、dp[i] = nums[i] + dp[i - 2] 偷当前屋子dp[i] = dp[i - 1]  不偷当前屋子选一个比较大的3、dp[0] = nums[0]dp[1] = max(nums[0], nums[1])*/
class Solution {public int rob(int[] nums) {if(nums.length <= 1){return nums[0];}if(nums.length <= 2){return Math.max(nums[0], nums[1]);}int[] dp = new int[nums.length];// 初始值dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);// dp[i] = max(nums[i] + dp[i-2], dp[i-1]);for(int i = 2; i < nums.length; i++){dp[i] = Math.max(nums[i] + dp[i-2], dp[i-1]);}return dp[nums.length-1];}
}

leetcode62题.不同路径

62. 不同路径 - 力扣(LeetCode)

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

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

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

示例 1:

img

输入: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[i][j]:到达[i, j]时,一共有dp[i, j]个路径
2、关系式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
3、初始化dp[0][0...m - 1] = 1dp[0...n - 1][0] = 1*/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];}
}

leetcode64题.最小路径和

64. 最小路径和 - 力扣(LeetCode)

给定一个包含非负整数的 *m* x *n* 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

img

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 200
class Solution {/*动态规划三部曲1、定义数组含义dp[i][j]:当到达 (i,j) 这个位置时,最小路径和为 dp[i][j]。2、关系式dp[i][j]. dp[i-1][j] dp[i][j-1]如何才能到达 (i,j)(1)要么从 (i-1,j) 这个位置向下走一步=>dp[i][j] = dp[i-1][j] + grid[i][j](2)要么是从(i,j-1)这个位置向右走一步=>dp[i][j] = dp[i][j-1] + grid[i][j]dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]3、初始值dp[0][0~m-1]dp[0~n-1][0]*/public int minPathSum(int[][] grid) {int n = grid.length;int m = grid[0].length;int[][] dp = new int[n][m];// 求初始值dp[0][0] = grid[0][0];for(int j = 1; j < m; j++){dp[0][j] = dp[0][j-1] + grid[0][j];}for(int i = 1; i < n; i++){dp[i][0] = dp[i-1][0] + grid[i][0];}for(int i = 1; i < n; i++){for(int j = 1; j < m; j++){dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];}}return dp[n-1][m-1];}
}

leetcode63题.63不同路径II

63. 不同路径 II - 力扣(LeetCode)

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

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

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

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

示例 1:

img

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

示例 2:

img

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

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1
class Solution {/*第一步:dp[i][j]:表示走到(i,j)这个地方一共有 dp[i][j]条路径第二步:找关系式if(obstacleGrid[i][j] == 1){dp[i][j] = 0}else{dp[i][j] = dp[i-1][j] + dp[i][j-1]}第三步:初始值dp[0][0] = obstacleGrid[0][0] == 1? 0 : 1; dp[0][j] = dp[0][j-1]dp[i][0] = dp[i-1][0];*/public int uniquePathsWithObstacles(int[][] obstacleGrid) {int n = obstacleGrid.length;int m = obstacleGrid[0].length;int[][] dp = new int[n][m];dp[0][0] = obstacleGrid[0][0] == 1 ? 0 : 1;// 最上面一行for(int j = 1; j < m; j++){dp[0][j] = obstacleGrid[0][j] == 1 ? 0 : dp[0][j-1];}// 最左边一列for(int i = 1; i < n; i++){dp[i][0] = obstacleGrid[i][0] == 1 ? 0 : dp[i-1][0];}for(int i = 1; i < n; i++){for(int j = 1; j < m; j++){if(obstacleGrid[i][j] == 1){dp[i][j] = 0;}else{dp[i][j] = dp[i-1][j] + dp[i][j-1];}}}return dp[n-1][m-1];}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 发展的三次危机

前几天闹得沸沸扬扬的OpenAI宫斗事件终于落下帷幕&#xff0c;事情以奥特曼回归OpenAI继续担当CEO并且重组董事会结局。 看起来还算一个不错的结果。 OpenAI 作为目前全球大模型的领先者和佼佼者&#xff0c;他的一举一动肯定会影响整个人类 AI 的发展历程&#xff0c;这次宫…

P9242 [蓝桥杯 2023 省 B] 接龙数列(dp+最长接龙序列+分类)

1. 计算0~9为结尾的最长子串长度 2. 对于每个数字&#xff0c;比较其开头可连接子串长度1 与 原来以其末位为末尾的子串长度 3. 更新以其末位为末尾的子串长度 #include<iostream> #include<string.h>using namespace std;// 相当于记录…

万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC

@[toc] 万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文…

未来的大模型发展又会走向哪一边

近期&#xff0c;特斯拉CEO马斯克公开表示&#xff1a;OpenAI不该闭源&#xff0c;自家首款聊天机器人将开源。在数字化时代&#xff0c;开源与闭源软件的辩论一直是技术界的热门话题。开源是否能够带来更好的创新与合作&#xff1f;闭源是否能够保护商业利益与技术安全&#x…

力扣141-环形链表

文章目录 力扣141-环形链表示例代码实现要点剖析 力扣141-环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测…

重新认识电声器件!

电声器件&#xff1a;实现电声转换的重要工具 在科技快速发展的今天&#xff0c;电声器件已经深入到我们生活的方方面面。无论是音乐、语音通信、电影等娱乐领域&#xff0c;还是雷达、电子侦察等军事领域&#xff0c;甚至在生物医学工程中&#xff0c;如助听器和人工耳蜗等设备…

计算机基础知识60

MySQL分组 # 概念&#xff1a;分组是按照某个指定的条件将单个单个的个体分成一个个整体 # MySQL分组的关键字&#xff1a;group by # 分组一般配合聚合函数使用&#xff1a; sum max min avg count 基本的语法格式: group by 字段名 [having 条件表达式] # 单独使用 group by关…

再探Java集合系列—ArrayList

适用于什么场景&#xff1f; 检索比较多的场景&#xff0c;例如学生成绩管理系统&#xff0c;老师对学生的成绩进行排名或查询操作 ArrayList有哪些特点&#xff1f; 1、ArrayList集合底层采用了数组数据结构&#xff0c;是Object类型 2、动态数组。ArrayList的默认初始容量…

Makefile之 CFLAGS CXXFLAGS CC LDFLAGS LD

Makefile之 CFLAGS CXXFLAGS CC LDFLAGS LD 1&#xff09;CFLAGS&#xff1a;该环境变量用于指定C语言的编译器选项。它包含了编译C源代码时所需的选项&#xff0c;例如优化级别、警告级别、编译器标志等。在Makefile中&#xff0c;可以将CFLAGS设置为任何所需的编译器选项。例…

BSD socket API

API函数 以下函数是最基本的 socket API socket() 创造某种类型的套接字&#xff0c;分配一些系统资源&#xff0c;用返回的整数识别。 bind() 一般是用在服务器这边&#xff0c;和一个套接字地址结构相连&#xff0c;比如说是一个特定的本地端口号和一个IP地址。 listen()用在…

第1章 理解知识图谱(一)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

SpringBoot : ch11 整合RabbitMQ

前言 在当今的互联网时代&#xff0c;消息队列成为了构建高可靠、高性能系统的重要组件之一。RabbitMQ作为一个可靠、灵活的消息中间件&#xff0c;被广泛应用于各种分布式系统中。 本篇博客将介绍如何使用Spring Boot整合RabbitMQ&#xff0c;实现消息的发送和接收。通过这种…

基于SpringBoot的教师工作量管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的教师工作量管理系统,ja…

硬件工程师助理怎么买器件

1. 买器件的要求。 1. 保证器件的质量。 2. 货期近可能的合适。 3.稳定渠道。 2. 器件到哪里买 1. 首先到立创商城去买&#xff0c;因为方便&#xff0c;价格明显&#xff0c;质量有保证。 立创商城链接&#xff1a;新人注册享元器件优惠券_新人特价商品_立创商城 (szlcsc.com…

视频集中存储/磁盘阵列EasyCVR平台黑名单异常解决步骤是什么?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

华为云(HECS)docker环境下安装jenkins

Jenkins是一个开源的自动化工具&#xff0c;可以自动化地完成构建、测试、交付或部署等任务。总之重点就是三个字&#xff1a;自动化&#xff0c;至于如何实现这些功能&#xff0c;Jenkins基于插件化的机制&#xff0c;提供了众多的插件来完成持续集成CI与持续部署CD。 【持续…

【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

每日随想:在Python中字符串如何转列表

要将一个字符串转换为列表&#xff0c;可以使用字符串的 split() 方法。split() 方法根据指定的分隔符将字符串分割成子串&#xff0c;并将这些子串组成列表。 假设有一个用空格分隔的字符串&#xff0c;我们想要将其转换为一个单词列表&#xff1a; my_string "Hello w…

Ajax 是什么? 如何创建一个 Ajax?

Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种使用客户端JavaScript发送异步HTTP请求到服务器的技术&#xff0c;以便在不重新加载整个页面的情况下更新部分网页内容。 使用Ajax的原因有很多&#xff0c;以下是其中一些&#xff1a; 改善用户体验&…

pdf文件能扫码查看吗?一键做文本二维码

pdf格式是常用的一种文件格式&#xff0c;很多资料、展示性的内容都会选择这种格式&#xff0c;现在很多人都需要将文件生成二维码图片后分享给他人&#xff0c;那么文件存入二维码展示的方法有哪些呢&#xff1f;下面给大家分享一招使用二维码生成器来生成二维码图片的操作方法…