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

2023-11-19

目录

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];
    }

学习并非一朝一夕的事情,所以即使我们懂得了动态规划的原理,但还是需要日复一日的刷题,最终才能量变引起质变,达到熟练的效果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【动态规划】从入门到实践---动态规划详解 的相关文章

随机推荐

  • Python--内建函数大全

    Python 解释器内置了许多函数和类型 列表如下 按字母排序 省略了几个我没用过或者不常用的 内建函数表 abs delattr hash memoryview set
  • 结构体排序------蓝桥杯

    题目 给出 nn 个人的语文 数学 英语的成绩 你需要把他们的成绩降序输出 排序的规则 先按总分排序 如果总分相等 就按语文成绩降序排序 如果语文成绩还相等 就按数学成绩降序排序 如果数学成绩还相等 就按姓名字典序升序排序 输入 第一行是一
  • Python中MongoDB的使用方法

    一 MongoDB是什么 在百度上查询的时候主要看到三个关键字 数据库 非关系型 查询功能强大 总结为查询功能强大的非关系型数据库 什么是数据库 应该是用来存储数据的 非关系型的意思 不不不 关系型的意思我都不懂 查询功能强大的意思应该是查
  • python matplotlib pyplot绘制散点图

    pyplot散点图示例 import matplotlib pyplot as plt import numpy as np import math import random plt rcParams font sans serif Si
  • 【Blender】快捷键整理

    Z 弹出着色模式菜单 shift Z 线框展示 Ctrl 空格 最大化视窗切换 N 隐藏侧栏 T 显示隐藏左侧工具菜单 小键盘 在视口内最大化显示当前选择物体 FN home 在视口内最大化显示场景内所有物体 SHIFT C 查看全部 sh
  • N沟道和P沟道MOS管的四个不同点

    作者 快捷芯 功率半导体创新品牌 1 芯片材质不同 虽然芯片都是硅基 但是掺杂的材质是不同 使得N沟道MOS管是通过电子形成电流沟道 P沟道MOS管是用空穴流作为载流子 具体原理可以参考一些教科书 属于工艺方面的问题 2 同等参数P沟道MO
  • Upload-labs 1-21关 靶场通关攻略(全网最全最完整)

    Pass 01 前端验证 因为是进行前端JS校验 因此可以直接在浏览器检查代码把checkFile 函数 即如下图红色框选中的函数 删了或者也可以把红色框改成true 并按回车 即可成功上传php文件 复制图片地址并用蚁剑进行连接 Pass
  • Hiv练习题之网站连续登陆天数分析

    数据源 有如下登录信息 userId day 1 2019 05 01 1 2019 05 02 1 2019 05 03 1 2019 05 04 1 2019 05 05 1 2019 05 06 1 2019 05 07 1 2019
  • Leetcode28. 找出字符串中第一个匹配项的下标

    代码 class Solution public int strStr String haystack String needle if haystack equals needle return 0 int len needle leng
  • IDEA中创建单元测试过程 JUnit

    1 在src同级别下创意一个test目录 2 右键这个test文件夹 设置为测试专用文件夹 然后在在下面创建一个java目录 根据你的需求 多级建目录 3 选择一个类 比如xxxServiceImpl xxDaoImpl 然后邮件 选择go
  • synchronized关键字修饰static方法和非static方法学习测试结论

    最近在学习研究synchronized关键字 发现有个疑问 在同一个类中 有多个sync方法 当线程调用其中的一个方法的时候 其他的线程能调用其他的sync方法么 为此做了简单的测试 详细的测试过程略过 读者可使用测试代码自行操作 得出结论
  • OKHttp详解

    OkHttp 是一套处理 HTTP 网络请求的依赖库 由 Square 公司设计研发并开源 目前可以在 Java 和 Kotlin 中使用 对于 Android App 来说 OkHttp 现在几乎已经占据了所有的网络请求操作 RetroF
  • Web项目实战

    文章目录 运行环境 1 前言 2 挑选模板 2 1 前端模板 2 2 后端模板 2 3 总结 3 实现注册与登陆 3 1 项目结构 3 2 注册 3 2 1 JDBC连接池连接 3 2 2 dao层实现JDBC的判重 插入 3 2 3 设计
  • Linux字符设备驱动的register_chrdev()与unregister_chrdev()

    Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合 通过这些函数使得Windows的设备操作犹如文件一般 在应用程序看来 硬件设备只是一个设备文件 应用程序可以象操作普通文件一样对硬件设备进行操作 如open close rea
  • 【RDMA】RDMA编程入门--编辑中

    目录 一 前言 二 基本概念 1 队列和队列成员 2 传输模式 简介 单边双边传输流程简述 3 编程接口 verbs API 三 编程示例 工作大致流程说明 四 编程代码实例 5 RDMA编程概述 5 1 传输操作 5 2传输模式 5 3相
  • easyexcel分批次导出excel文件

    使用easyexcel进行分批次导出1000万条数据的步骤如下 首先 需要在pom xml文件中添加easyexcel的依赖 例如
  • ChatGPT也不会的k8s安装方法——极简安装法

    要学习k8s 首先要有一个k8s 那么如何才能获得一个k8s呢 这不由得让我想到了最近比较火的ChatGPT 以下简称小恰 俗话说 遇事不决问小恰 解决效率翻上翻 让我们先来看看小恰怎么回答的吧 问小恰 由于众所周知的原因 国内使用小恰比较
  • 【Hyperledger Fabric 源码解读】solo

    release 2 2 orderer consensus solo consensus go Copyright IBM Corp All Rights Reserved SPDX License Identifier Apache 2
  • 持久化RDB/AOF-Redis(三)

    上篇文章说了数据持久化 这里再学习一个命令 数据结构 Redis 二 https blog csdn net ke1ying article details 131118016 一 查询所有key scan 0 match zhuge co
  • 【动态规划】从入门到实践---动态规划详解

    目录 1 动态规划概念 一 定义数组元素的含义 二 找到数组元素之间的关系表达式 三 找到初始值 2 案例详解 一 爬楼梯 1 定义数组元素的含义 2 找到数组元素之间的关系表达式 3 找到初始值 案例二 最短路径 题目 做题步骤 1 定义