算法的四大思想之一:动态规划

news2024/11/15 13:42:38

一、动态规划

什么是动态规划?

动态规划(Dynamic Programming,简称DP)是一种解决问题的算法思想,它将一个大问题拆分成多个相互重叠的子问题,并且通过解决这些子问题来求解原始问题

核心思想

拆分大问题为子问题,记住已经解决的子问题,减少重复计算。

 

二、 从解斐波那契数列看动态规划

这里我们将告诉小伙伴们怎么理解动态规划中的“重复计算”和“记住”,并逐步引出动态规划。

斐波那契数列的特点是数列中的每个数都是由前面两个数相加得到的。例如:1, 1, 2, 3, 5, 8, 13, ...

 

普通递归求解(自顶向下+自底向上+重复计算)

用递归函数来求解就是:

int Fib(int n) { //递归算法1
  if (n==1 || n==2){ 
      return 1;
  }else{ 
    return Fib(n-1)+Fib(n-2);
  }
}

 对于这个递归函数,求解第五个斐波那契数就是调用Fib(5)。递归过程如下图:

这个普通递归调用Fib(5)采用自顶向下,然后直到调用Fib(2)和Fib(1)后触底反弹,自底向上的执行过程,如上图。

可以看到计算过程中存在大量的重复计算,例如求Fib(5)的过程,如上图蓝色部分存在两次重复计算Fib(3)值的情况,这个就是重复计算,需要我们避免。

 

备忘录算法求解(自顶向下+自底向上)

我们可以设计一个一维dp数组,用dp[i]存放Fib(i)的值,初始化时数组中所有元素都是-1。对应的算法Fib如下所示:

int Fib(int n) {//带备忘的递归算法
  if(n == 0||n == 1) return 1; //递归边界
  if(dp[n]!= -1) return dp[n]; //备忘录中有值
  else{
    dp[n] = Fib1(n-1) + Fib1(n-2); //求得的值存入备忘录
    return dp[n];
  }
}

用数组(或者其他的什么东西)保存已经计算过的子问题,这个过程就叫记忆。是不是很像人常用的备忘录呀~o( ̄▽ ̄)ブ

所以!已经计算过的、得到结果的子问题我们不能忘记!而是要用某种东西保存,让程序“记住”它。这样下次还要用的时候就不用重新计算一下,直接调用即可,节约时间。

就像一位名人说的那样:

Those who cannot remember the past are condemned to repeat it. 忘记过去的人注定会重蹈覆辙。——乔治·桑塔亚纳《常识中的理性》

 

动态规划法(自底向上) 

使用备忘录算法可以避免大量的重复计算。但是我每次使用都需要先从上到下,触底,然后再自底向上返回。这样感觉好累呀😩我能不能就跑一趟呀?本大学生动不了一点。

这就是动态规划!省略自顶向下的过程,直接自底向上!好!就喜欢这种简洁的想法👍

执行过程改变为自底向上,即先求出子问题解,将计算结果存放在一张表中,而且相同的子问题只计算一次,在后面需要时只是简单查表(访问数组,这个数组也叫动态规划数组),以避免重复计算。

算法伪代码如下:

int dp[MAX]; //所有元素初始化为0
int Fib(int n) { //迭代实现
  dp[0]=dp[1]=1;
  for (int i=2;i<n;i++){ 
    dp[i]=dp[i-1]+dp[i-2]; //计算子问题
  }
  return dp[n];
}

 嘶~这个伪代码怎么体现查表的?🤔

很简单,例如求解Fib(5):

  • 当i=2,dp[2]=dp[1]+dp[0]=2;

  • 当i=4,dp[4]=dp[3]+dp[2]。此时dp[2],也就是第三个斐波那契数之前已经被计算过,被保存在了dp[2],直接查表(访问dp[2])就可以了。

求解Fib(5)时的计算过程如下:

  • (1)计算出Fib(1)=1

  • (2)计算出Fib(2)=1

  • (3)计算出Fib(3)=2

  • (4)计算出Fib(4)=3

  • (5)计算出Fib(5)=5

 

优化(减少空间复杂度) 

我们观察到对于每一个斐波那契数,它的数值其实只与它的前两个数的数值有关,我们不需要记录除了这两个数之外的数。因此,用不上那么大的一个数组,只需要两个变量。

int Fib(int n){  //优化动态规划数组,使用两个变量
  if(n==1) return 1;
  else if(n==2) return 2;
  else{ 
    int a=1,b=2,c;
    for (int i=3;i<=n;i++){ 
      c=a+b;
      a=b; 
      b=c;
    }
    return c;
  }
}

 

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

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

相关文章

vue3+luckyexcel+php在线编辑excel文件

开发过程中&#xff0c;需要开发一个在线编辑excel文档的功能&#xff0c;找到了这个合适的组件 Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源。 可以导入文档&#xff0c;预览、编辑、保存、导出等功能&#xff0c;可以满…

RabbitMQ 和 Kafka 对比

本文对RabbitMQ 和 Kafka 进行下比较 文章目录 前言RabbitMQ架构队列消费队列生产 Kafka本文小结 前言 开源社区有好多优秀的队列中间件&#xff0c;比如RabbitMQ和Kafka&#xff0c;每个队列都貌似有其特性&#xff0c;在进行工程选择时&#xff0c;往往眼花缭乱&#xff0c;不…

【MATLAB】PSO粒子群优化BiLSTM(PSO_BiLSTM)的时间序列预测

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 基于PSO粒子群优化的BiLSTM的时间序列预测算法的基本原理如下&#xff1a; 「双向长短时记忆&#xff08;BiLSTM&#xff09;模型」&#xff1a;这是一种深度学习模型&#xff0c;特别适用…

从现场到远程:PLC网关设备售后服务升级换代

问题 作为自动化企业&#xff0c;以前在调试PLC程序时&#xff0c;不得不在现场调试&#xff0c;遇到软件维护和售后服务时&#xff0c;甚至给公司带来一定的经营成本和维护成本的压力&#xff0c;PLC网关正好解决了这一难题。 PLC工业网关是可以让工业PLC设备轻松接入互联网…

GPT分区格式

GPT分区格式 [rootlocalhost ~]# gdisk /dev/sdb -bash: gdisk: 未找到命令 [rootlocalhost ~]# yum -y install gdisk- gdisk命令用于查看磁盘使用情况和磁盘分区&#xff08;GPT分区格式&#xff09; - 命令格式&#xff1a;gdisk [选项...] [设备路径] - 常用选项&…

linux 网络工具(二)

linux 网络工具 1. ip命令簇4.1 address4.2 link4.3 route4.4 rule 2. 其他常用命令2.1 ifup/ifdown2.2 配置主机名2.3 设置DNS服务器指向2.4 配置域名解析2.5 ss2.6 路由相关配置文件2.7 查看机器可用端口2.8 traceroute2.9 dhclient 1. ip命令簇 Linux的ip命令和ifconfig类似…

案例189:基于微信小程序的高校教务管理系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

Three.js基础入门介绍——Three.js学习三【借助控制器操作相机】

在Three.js基础入门介绍——Three.js学习二【极简入门】中介绍了如何搭建Three.js开发环境并实现一个包含旋转立方体的场景示例&#xff0c;以此为前提&#xff0c;本篇将引进一个控制器的概念并使用”轨道控制器”&#xff08;OrbitControls&#xff09;来达到从不同方向展示场…

使用 SSH 方式实现 Git 远程连接GitHub

git是目前世界上最先进的分布式版本控制系统&#xff0c;相比于SVN&#xff0c;分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在&#xff0c;也就是有没有联网都可以正常工作&#xff01;当有网络的时候&#xff0c;再把本地提交推送一下就完成了同步&…

【信息安全原理】——入侵检测与网络欺骗(学习笔记)

&#x1f4d6; 前言&#xff1a;在网络安全防护领域&#xff0c;防火墙是保护网络安全的一种最常用的设备。网络管理员希望通过在网络边界合理使用防火墙&#xff0c;屏蔽源于外网的各类网络攻击。但是&#xff0c;防火墙由于自身的种种限制&#xff0c;并不能阻止所有攻击行为…

open_vins 安装(ubuntu18.04 opencv3.2.0)

openvins官网 Getting Started Installation Guide (ROS1 and ROS2) | OpenVINS Ubuntu 18.04 ROS 1 Melodic (uses OpenCV 3.2) 这里他指的是ros1 melodic&#xff0c;他们用的opencv3.2测试过。 open_vins 官方给的组合Ubuntu 18.04 ROS 1 Melodic (uses OpenCV 3.2) Ub…

k8s二进制部署2

部署 Worker Node 组件 //在所有 node 节点上操作 #创建kubernetes工作目录 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} #上传 node.zip 到 /opt 目录中&#xff0c;解压 node.zip 压缩包&#xff0c;获得kubelet.sh、proxy.sh cd /opt/ unzip node.zip chmod x kubelet.…

视觉学习笔记13——既是模型,又是模型中转站的onnx

系列文章目录 入门级深度学习环境搭建 文章目录 系列文章目录前言一、ONNX是什么&#xff1f;二、环境安装1、在 Anaconda 环境中安装 onnx2、在 Anaconda 环境中卸载 onnx3、anaconda 安装onnxruntime 未完待续。。。 前言 假设一个场景&#xff1a;现在某组织因为主要开发用…

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷 一&#xff1a;fdisk磁盘分区并挂载1.查看磁盘分区信息2.分区3.强制系统重新读取分区(避免重启系统)4.格式化分区5.创建挂载目录6.设置开机自动挂载&#xff1a;7.验证并自动挂载(执行了该命令不需要重启系统)8.查看挂载007.异常情况处…

Feature Prediction Diffusion Model for Video Anomaly Detection 论文阅读

Feature Prediction Diffusion Model for Video Anomaly Detection论文阅读 Abstract1. Introduction2. Related work3. Method3.1. Problem Formulation3.2. Feature prediction diffusion module 3.3. Feature refinement diffusion module4. Experiments and discussions4.1…

Flink1.17实战教程(第六篇:容错机制)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

如何在无公网IP环境使用Windows远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…

使用Visual Studio 2022 winform项目打包成安装程序.exe

winform项目打包 1.安装扩展插件 Microsoft Visual Studio Installer Projects 20222.在解决方案上新建一个setup project 项目3.新建成功如下图&#xff0c;之后添加你的winform程序生成之后的debug下的文件4.在Application Folder上点击右键->Add->项目输出->主输出…

从实际业务问题出发去分析Eureka-Server端源码

文章目录 前言1.EnableEurekaServer2.初始化缓存3.jersey应用程序构建3.1注册jeseryFilter3.2构建JerseyApplication 4.处理注册请求5.registry&#xff08;&#xff09; 前言 前段时间遇到了一个业务问题就是k8s滚动发布Eureka微服务的过程中接口会有很多告警&#xff0c;当时…

黄向墨创立的玉湖冷链参加首届中欧班列(成渝)全球合作伙伴大会签订

玉湖集团是总部设于香港的有二十多年历史的跨国实业投资集团,由祖籍广东的香港企业家、著名爱国侨领黄向墨先生创立。黄向墨先生现任中国和平统一促进会常务理事、中华海外联谊会常务理事、香港选委会委员及香港全国人大代表选举会议成员。 12月7日,玉湖冷链参加首届中欧班列(…