经典动态规划问题详解以及其主要应用场景
创始人
2025-05-29 11:33:07

文章目录

  • 0、概念
    • 0.1 定义:
    • 0.2 核心思想:
    • 0.3 适用范围:
    • 0.4 基本步骤:
  • 1、例子
    • 1.1、解法一:递归
    • 1.2、解法二:带记录的递归
    • 1.3、解法三:动态规划
  • 2、总结
  • 3、引用


在这里插入图片描述

0、概念

0.1 定义:

** 动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。。

0.2 核心思想:

动态规划最核心的思想,就在于拆分子问题,记住过往,减少重复计算。

0.3 适用范围:

什么样的题目适合动态规划? 如果一个问题,可以把所有可能的答案穷举出来,并且穷举出来后,发现存在重叠子问题,就可以考虑使用动态规划。
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法,常见的分类如下,具体啥含义可以自行查询:动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类
1、线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;
2、区域动规:石子合并,加分二叉树,统计单词个数,炮兵布阵等;
3、树形动规:贪吃的九头龙,二分查找书,聚会的欢乐,数字三角形等;
4、背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题,挤牛奶等;
5、应用实例:最短路径问题,项目管理,网络流优化等。

0.4 基本步骤:

动态规划的核心思想就是拆分子问题,记住过往,减少重复计算。 并且动态规划一般都是自底向上的,动态规划的大致思路:

  1. 穷举分析
  2. 确定边界
  3. 找出规律,确定最优子结构
  4. 写出状态转移方程

1、例子

问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法?

这个问题乍一看无从分析,但是穷举是可以的,我们倒着推要想:
1、跳到第10级台阶,要么是先跳到第9级,然后再跳1级台阶上去;要么是先跳到第8级,然后一次迈2级台阶上去。
同理,要想跳到第9级台阶,要么是先跳到第8级,然后再跳1级台阶上去;要么是先跳到第7级,然后一次迈2级台阶上去。
要想跳到第8级台阶,要么是先跳到第7级,然后再跳1级台阶上去;要么是先跳到第6级,然后一次迈2级台阶上去。

化成数学公式

f(10) = f(9)+f(8)
f (9)  = f(8) + f(7)
f (8)  = f(7) + f(6)
...
f(3) = f(2) + f(1)即通用公式为: f(n) = f(n-1) + f(n-2)

1.1、解法一:递归

    //伪代码int recursion (int n) {if(n == 1){ return 1;}if(n == 2){ return 2;}return recursion (n-1) + recursion (n-2);}

递归算法有缺点,当这个n很大时候,那么系统开销很大,因为要调用的层级太多,系统保存的量很大,而起很多是重复量,优化代码如下

1.2、解法二:带记录的递归

    //伪代码//用map保存计算过程量,作为备忘录Map recordMap = new HashMap();int recursion (int n) {if(n == 1){ return 1;}if(n == 2){ return 2;}//先判断有没计算过,即看看备忘录有没有if (recordMap.containsKey(n)) {return recordMap.get(n);} else {// 备忘录没有,即没有计算过,执行递归计算,并且把结果保存到备忘录map中recordMap.put(n, (numWays(n - 1) + numWays(n - 2)) % 1000000007);   //防止越界return recordMap.get(n);}}

1.3、解法三:动态规划

动态规划其实包含上述递归的思想,但是和带记录的递归不一样的是,递归是自上而下的,动态规划是自下而上的,取得局部最优解在往上去取得上层最优解,并且局部最优解不受上层影响。

    //伪代码int numWays(int n) {if (n<= 1) {return 1;}if (n == 2) {return 2;}int a = 1,b = 2;;int temp = 0;for (int i = 3; i <= n; i++) {temp = (a + b)% 1000000007;a = b;b = temp;}return temp;}

2、总结

对应0的解题步骤,结合1的实例可以看出主要步骤

  1. 穷举分析:
    首先对于问题,我们一步步分析其中规律,确定该问题是不是该
    问题穷举法完成,不管其复杂与否。

  2. 确定边界:
    通过穷举分析,我们发现,当台阶数是1的时候或者2的时候,可 以明确知道青蛙跳法。f(1) =1,f(2) = 2,当台阶n>=3时,已经呈现出规律f(3) = f(2) + f(1) =3,因此f(1) =1,f(2) = 2就是青蛙跳阶的边界。

  3. 找出规律,确定最优子结构:
    n>=3时,已经呈现出规律 f(n) = f(n-1) + f(n-2) ,因此,f(n-1)和f(n-2) 称为 f(n) 的最优子结构,关于最优子结构,我是这么理解的,就是可以用一个公式表示该问题的所有一般规律,并且是无记忆的。

  4. 写出状态转移方程:
    f(n) = f(n-1) + f(n-2)
    f(1) =1,f(2) = 2

  5. 代码实现一般模板:

dp[0][0][...] = 边界值
for(状态1 :所有状态1的值){for(状态2 :所有状态2的值){for(...){//状态转移方程dp[状态1][状态2][...] = 求最值}}
}

3、引用

1、看一遍就理解:动态规划详解
2、算法-动态规划 Dynamic Programming–从菜鸟到老鸟
3、第9章 动态规划
4、动态规划的实际应用:图片压缩算法


相关内容

热门资讯

鸟哥的Linux私房菜 She... 第十二章、学习 Shell Scripts https://linux.vbird.org/linu...
2分钟快速了解!全网最详细的性...  目录:导读 Redis 简介 Redis 优势 Redis与其他key-value存...
设计模式-02 4,创建型模式 4.2 工厂模式 4.2.1 概述 需求:设计一个咖啡店...
纠错码中的汉明码,NAND F...      纠错码是一种用在不可靠的或者噪音比较大的通信信道中用来控制数据传输错误的技术。这种技术的核...
【Java】P14 面向对象(... 类的封装性封装性高内聚与低耦合何为封装性如何封装get 与 set 方法案例 封装性 高内聚与低耦...
【FPGA】Xilinx Co... 功能描述 1、Rotate Rotate 实现的功能是坐标的旋转。 输入 X, Y, Phase 输...
【Pytorch】使用Pyto... 文章目录1. 题目描述2. 代码实现验证写在最后 1. 题目描述 在这个例子中网络结构如下所示&#...
client-go disco... 1. 概述 discovery包主要用来发现服务器支持的API组、版本和资源的方法,及...
[LeetCode周赛复盘] ... [LeetCode周赛复盘] 第 100 场双周赛20230318 一、本周周赛总结二、 [Easy...
Matlab基础教学入门 Matlab是一种非常强大的数学计算工具,广泛应用于科学和工程领域。本篇文章将介绍一些...
设计模式-02 4,创建型模式 4.2 工厂模式 4.2.1 概述 需求:设计一个咖啡店...
条款21:优先考虑使用std:... 让我们先对std::make_unique和std::make_shared做个铺垫。std::ma...
Leetcode 第四天 动态... 来源:力扣(LeetCode) 链接:htt...
MongoDB用户管理授权 文章目录1 角色类型2 注意事项3 给单个数据库授权4 给一个用户授权多个数据库5 其它命令 1 角...
下载、安装JDK、sublim... 直接官网下载,jdk8或者jdk11。配置环境变量:如果不配置环境变量&...
算法的时间复杂度介绍 本文主要算法时间复杂度的相关知识。1 概述算法(Algorithm)是指...
编码方式概括 1.三种码表1.iso8859-1码表:是一种8位的单字节编码方式。它可以表示256个...
YOLOv5源码逐行超详细注释... 前言  本篇文章主要是对YOLOv5项目的验证部分。这个文件之前是叫test.py,后...
centos docker 安... 1、首先安装docker 下面是一键安装脚本 curl -fsSL https://get.dock...
线上操作规范 1.目的    1)为了避免测试线上随意操作给客户造成损失   2)为了...
查找算法之费氏搜寻法 给定一个大小为n的排序数组arr[],并在其中搜索一个元素x。如果x在数组中ÿ...
cv2报错:Unsupport... cv2 报错 error: OpenCV(4.6.0) /io/opencv/modules/img...
DVWA_xss 反射型xsslow直接在输入框输入提前准备的代码,就可以得到回显cookie信息 Me...
音视频开发编程技术(二):音频... 1. 音频简介   上一节讲过,视频的帧率即每秒钟采集多少张图片的概念。同理ÿ...
【Java学习笔记】33.Ja... 前言 本章介绍Java的HashSet及HashMap。 Java HashSet HashSet ...
RabbitMQ基础介绍及同步... 一、同步通讯与异步通讯 大多数情况下会使用同步,对并发没有很高的要求,但...
面试官:整理了一些react的... 请解释一下React生命周期。它们各自的作用是什么? React生命周期是指组件从创建...
【C++进阶】AVL树的实现 文章目录AVL树概念AVL树性质AVL树节点的结构AVL树的插入插入新节点更新整体节点的平衡因子旋转...
缺失的第一个正整数:给定一个未... 给定一个未排序的整数数组,找出其中未出现的最小正整数。 (本文获得CSDN质量评分...
[架构之路-141]-《软考-... 前言:如何“从无到有”设计一个企业信息系统?本文将探索这个话题。第1章 ...