【动态规划】从入门到实践---动态规划详解

这篇具有很好参考价值的文章主要介绍了【动态规划】从入门到实践---动态规划详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.动态规划概念

一.定义数组元素的含义

二.找到数组元素之间的关系表达式

三.找到初始值

2.案例详解

一:爬楼梯

1.定义数组元素的含义

2.找到数组元素之间的关系表达式

3.找到初始值

案例二:最短路径

题目:

做题步骤:

1.定义数组的含义

2.找到数组元素之间的关系表达式

3.找到初始值

代码展示:


1.动态规划概念

动态规划就是利用历史记录,来避免我们进行重复计算,而这些历史记录,我们需要用一些变量来保存,一般使用一维数组或者二维数组,下面我们来说动态规划最重要的三个步骤:

一.定义数组元素的含义

因为我们需要用一个数组来保存历史数据,那么最重要的来了,需要保存的历史数据是什么?

也就是数组内存放的元素含义是什么?

二.找到数组元素之间的关系表达式

也就是说,我们可以利用数组中保存的历史数据推理计算出来新的元素值,所以我们要找到数组之间元素的关系表达式,例如dp[n] = dp[n-1] + dp[n-2]这就是一个关系表达式,然而这一步,恰恰是动态规划中最难的一步

三.找到初始值

学过数学的人都知道,虽然我们拥有了元素之间的关系表达式,知道了dp[n] = dp[n-1] + dp[n-2],但是我们还得知道初始值啊,不然一直往前推,推到不能再分解的时候,我们不知到初始元素的值,怎么计算所有的元素值呢?

拥有了初始值,也拥有了数组之间的关系式,我们就可以计算出dp[n]的值了,dp[n]的值是由我们自己来定义的,我们想求得什么,我们就定义什么,这样就能解出题了

2.案例详解

一:爬楼梯

假设你正在爬楼梯。需要 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.定义数组元素的含义

首先我们来定义dp[i]的含义,既然我们要算出爬上楼顶需要多少种不同的方法,那么我们就可以定义dp[i]为爬到第i曾一共需要多少种方法?这样我们算出dp[i]就等于算出了最终的结果

2.找到数组元素之间的关系表达式

动态规划就是把一个大问题不停的分解成子问题,然后由子问题推导出大问题,这道题我们需要求的是dp[n],那么我们需要寻找dp[n]与历史数据之间的关系

这也是最最最难的一步:

这道题我们在爬楼梯时可以选择爬一级,也可以选择爬两级,所以我们爬到楼顶时有两种方式,

一种是从n-1级爬上来

一种时从n-2级爬上来

所以可得关系表达式为:dp[n] = dp[n-1] + dp[n-2]

3.找到初始值

这道题我们可以直观地看出dp[0] = 1,dp[1] = 1;

现在我们可以来写代码了:

public int climbStairs(int n) {
        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];
    }

案例二:最短路径

大部分动态规划都是需要用二维数组来解答的,所以这部分也格外重要

题目:

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

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

示例 1:

【动态规划】从入门到实践---动态规划详解

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

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 100

做题步骤:

1.定义数组的含义

求什么就怎么定义,所以我们定义数组dp[i][j]为当从左上角走到(i,j)这个位置时的最短路径,那么dp[m-1][n-1]就是我们所要求的答案

2.找到数组元素之间的关系表达式

由于题目中表示,每次只能向下或者向右移动一步,

第一种情况:当我们所处位置在上边界或者左边界时,我们只有一个方向的路可以选择,

此时状态转移方程为:

1.处于上边界 i = 0时 dp[i][j] = dp[i][j-1] + grid[i][j]

2.处于左边界 j = 0时 dp[i][j] = dp[i-1][j] + grid[i][j]

第二种情况既不处于左边界又不处于上边界

一共有两种方式可以到达(i,j)这个位置,

一种是从(i-1)(j)向右走一步到达

一种是从(i)(j-1)向下走一步到达

我们需要计算最短路径,所以关系式为 dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]

3.找到初始值

此题的初始值即为dp[0][0] = grid[0][0]

代码展示:

public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int [][] dp = new int[m][n];
        dp[0][0] = grid[0][0];
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(i == 0 && j == 0) {
                    continue;
                } else if (i == 0) {
                    dp[i][j] = dp[i][j-1] + grid[i][j];
                } else if(j == 0) {
                    dp[i][j] = dp[i-1][j] + grid[i][j];
                } else {
                    dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + grid[i][j];
                }
            }
        }
        return dp[m-1][n-1];
    }

学习并非一朝一夕的事情,所以即使我们懂得了动态规划的原理,但还是需要日复一日的刷题,最终才能量变引起质变,达到熟练的效果文章来源地址https://www.toymoban.com/news/detail-431946.html

到了这里,关于【动态规划】从入门到实践---动态规划详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划在算法中的实践

    【摘要】为了提高算法的效率,动态规划是在算法实践中经常使用的一个思想,有些问题会非常适合使用动态规划的思想来设计算法。本文将借助LeetCode上的一些例子,来讲解和说明动态规划在算法案例中的一些实践。 【】 动态规划 LeetCode 算法效率 算法 生活中会遇到

    2024年03月22日
    浏览(32)
  • 动态规划入门之线性动态规划

    P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目要求求连续得一段子串使其累加和最大。 我们做动态规划首先考虑小情况,然后推而广之。 假设三个数1,-2,5. 我们先选1然后我们在-2以及-2加1里边选,我们选-1,接着我们在-1以及5里边选我们选择5 由此我们发

    2024年02月12日
    浏览(41)
  • 动态规划入门之二维数组的动态规划(过河卒)

    P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 过河卒,首先科普一下象棋里面的马的跳跃一步的规则吧(这题真够坑人的,连个规则都不给出,害得我第一次交就全wa)。一张图解释   大家看所有标记为p的点的坐标就是马跳一步和原来的位置。解决

    2024年02月12日
    浏览(31)
  • 实验-动态规划(头歌实践教学平台-ACM/ICPC培训)

    任务描述 相关知识 编程要求 解题思路: 测试说明 任务描述 本关任务:编写用动态规划解决数塔问题。 相关知识 为了完成本关任务,你需要掌握:动态规划。 编程要求 求上图从顶层到顶层的一个路径,使路径上的数字和最大。要求输出最大的数字和max和数值和最大的路径

    2024年02月04日
    浏览(60)
  • 【算法入门】浅谈动态规划

    关于动态规划的定义,网上有很多,但对于初学者,看了定义之后,多少会有点懵,接下来我打算用俩到三个例题来引入动态规划的定义,我将动态规划分为动态和规划俩部分,动态说明它是变化的,规划说明它是从前到后的,所以综合下来就是后面的由前面或者说受前面影

    2024年04月12日
    浏览(34)
  • 动态规划(零)入门概念

    动态规划一直作为很重要的算法,其难度也一直让很多希望学动态规划的人望而却步。本篇文章将从动态规划的理论开始,从理念走向实战,带领大家去理解动态规划并且去用动态规划解决实际问题。 如果有不喜欢看文字性内容(太具有理论性)的或者已经学过动态规划的,

    2024年02月13日
    浏览(29)
  • 动态规划的入门

    https://www.bilibili.com/video/BV13Q4y197Wg/ 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的, 这一点就区分于贪心 , 贪心没有状态推导,而是从局部直接选最优的,

    2024年02月12日
    浏览(21)
  • 17.动态规划入门

    本次课我们将介绍介绍动态规划(Dynamic Programming, DP)及其解决的问题、根据其设计的算法及优化。 动态规划是编程解题的一种重要手段,它是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划算法通常用于求解具有某种最优性质的问题。在这

    2024年02月13日
    浏览(25)
  • 动态规划入门

    目录 基础入门理论 最大连续子串和 暴力求解  DP LCS最长公共子序列  LIS最长上升子序列 数塔 最大子矩阵和 背包问题 01背包 完全背包 多重背包        动态规划是一种常见的算法设计方法,主要用于优化多阶段决策问题的求解过程,具有高效性和可靠性。其基本思想是将

    2023年04月17日
    浏览(29)
  • 动态规划入门(DP)

    目录 1.DP概念和编程方法 1.1.DP概念 例如: 1.1.1.重叠子问题 1.1.2.最优子结构 “无后效性” 1.2.DP的两种编程方法 1.2.1.自顶向下与记忆化 1.2.2.自底向上与制表递推 对比两种方法 1.3.DP的设计和实现(0/1背包问题) 例题: Bone collector(hdu 2606) Problem Description Input Output Sample Inpu

    2024年02月19日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包