算法—动态规划

一、简介 

        动态规划(Dynamic Programming,简称 DP)是一种通过将原问题分解为若干个子问题来求解最优化问题的算法思想。动态规划常常用于解决那些可以被分解为更小的重叠子问题的场景。

        与分治法的区别在于,分治法会将问题分解成独立的子问题,而动态规划则是通过保存之前的计算结果来避免重复计算,从而提高效率。常见的问题有入门级:斐波那契数列、爬楼梯;进阶:背包问题、打家劫舍、股票问题、子序列问题。

        动态规划的核心思想是“记忆化” — 将子问题的解存储起来,避免重复计算。常见的实现方式有“自顶向下”的递归(带备忘录)和“自底向上”的迭代方法。尽管动态规划在初学者眼中可能有些晦涩,但通过理解和掌握它的基本思想和解决步骤,我们将能够有效地解决很多复杂的优化问题。掌握动态规划的技巧,不仅能够提高算法能力,也能为解决实际问题提供强有力的工具。

        接下来,我们将详细讲解如何使用动态规划解决问题,并且通过实际例子来理解这些步骤。

二、三大步骤

        1、定义数组元素的含义(状态定义):需要明确你定义的数组中每个元素的含义。常见的做法是用一维或二维数组来存储问题的子问题解。例如,dp[i] 可能表示到达第 i 个状态的最优解。

        2、找出数组元素之间的关系式(转移方程):通过问题的性质,推导出当前状态如何依赖于之前的状态。例如,dp[n] = dp[n-1] + dp[n-2] 表示某个问题的解由前两个状态的解来决定。

        3、找出初始值:设定边界条件,通常是最小的子问题,如 dp[0]dp[1],这些值是已知的或通过显式条件给出的。

        4、返回值

三、案例详解

先看一下入门案例

3.1 斐波那契数列

问题描述:

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

题目解析:

  1. 状态定义: 设 dp 为一维数组,其中 dp[i] 的值代表 斐波那契数列第 i 个数字 。
  2. 转移方程: dp[i+1]=dp[i]+dp[i−1] ,即对应数列定义 f(n+1)=f(n)+f(n−1) 。
  3. 初始状态: dp[0]=0, dp[1]=1 ,即初始化前两个数字。
  4. 返回值: dp[n] ,即斐波那契数列的第 n 个数字。

状态压缩:若新建长度为 n 的 dp 列表,则空间复杂度为 O(N) 。由于 dp 列表第 i 项只与第 i−1 和第 i−2 项有关,因此只需要初始化三个整形变量 sum, a, b ,利用辅助变量 sum 使 a,b 两数字交替前进即可 (具体实现见代码) 。节省了 dp 列表空间,因此空间复杂度降至 O(1) 。

实现代码:

class Solution {public int fib(int n) {// 初始化前两个斐波那契数int a = 0, b = 1, sum;// 通过迭代计算斐波那契数列for (int i = 0; i < n; i++) {sum = a + b;  // 当前斐波那契数等于前两个数的和a = b;         // 更新 a 为前一个斐波那契数b = sum;       // 更新 b 为当前斐波那契数}return a;  // 返回第 n 项,注意 i 从 0 开始,因此最终 a 存储的是 fib(n)}
}

3.2 爬楼梯问题

问题描述:

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

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

题目解析:

  1. 定义数组元素的含义:dp[i] 表示跳到第 i 级台阶的跳法总数。

  2. 关系式:可以从 i-1i-2 级台阶跳到 i 级,因此:dp[i] = dp[i-1] + dp[i-2]

  3. 初始值:dp[0] = 0 (没有台阶),dp[1] = 1 (只有1个台阶时,只有一种跳法)

同样进行状态压缩。

实现代码:

class Solution {public int climbStairs(int n) {// 初始值设置int p = 1, q = 1, r = 0;for (int i = 2; i <= n; i++) {r = p + q;  // 当前楼梯的总方法数p = q;      // p 更新为之前的 qq = r;      // q 更新为当前的 r}return q;  // 返回最终的爬楼梯方法数}//优化前// if (n <= 1) return n;// int dp[n + 1];// dp[0] = 0; dp[1] = 1;// for (int i = 2; i <= n; i++) {//     dp[i] = dp[i - 1] + dp[i - 2];// }// return dp[n];
}

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

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

相关文章

Android GO 版本锁屏声音无效问题

问题描述 Android go版本 在设置中打开锁屏音开关&#xff0c;息屏灭屏还是无声音 排查 vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\keyguard\KeyguardViewMediator.java private void setupLocked() {...String soundPath Settings.G…

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…

Tomcat的安装即使用

Tomcat的概念 Tomcat服务器是Java语言开发的&#xff0c;免费的开放源代码的Web应用服务器。 Tomcat处理静态HTML的能力远不及Apache或者Nginx&#xff0c;通常是作为一个Servlet和JSP容器&#xff0c;单独运行在后端。 Tomcat是由三个功能组合而成&#xff1a; java servlet&…

Linux:进程(环境变量、程序地址空间)

目录 冯诺依曼体系结构 操作系统 设计操作系统的目的 操作系统的管理 进程 PCB fork 进程状态 进程状态查看 僵尸进程 孤儿进程 进程优先级 查看、修改进程优先级命令 竞争、独立、并行、并发 进程切换 活动队列和运行队列 活动队列 过期队列 active指针…

对于使用exe4j打包,出现“NoClassDefFoundError: BOOT-INF/classes”的解决方案

jar使用exe4j打包exe&#xff0c;出现NoClassDefFoundError: BOOT-INF/classes 注意选取的jar包是使用build&#xff0c;而不是maven中的install 本文介绍解决这个方法的方案 点击Project Structure 按照如图所示选择 选择main class&#xff0c;选择你要打的main 如果遇到/M…

SpringBoot 编程式事务使用

目录 1. 简介2. TransactionTemplate 方式3. TransactionManager 方式4. 事务传播行为5. 事务隔离级别6. 最佳实践7. 常见问题与解决方案 1. 简介 编程式事务管理是通过编写代码来管理事务&#xff0c;相对于声明式事务&#xff08;Transactional注解&#xff09;&#xff0…

uniapp连接蓝牙操作(蓝牙设备地锁)

介绍&#xff1a; 本文采用uni-app框架来创建一个简单的用户界面&#xff0c;用于搜索、连接和发送命令给蓝牙设备。 1.打开蓝牙适配器 function openBluetooth() {uni.openBluetoothAdapter({success() {uni.offBluetoothDeviceFound();// 监听新设备发现事件uni.onBlueto…

web:pc端企业微信登录-vue版

官方文档&#xff1a;developer.work.weixin.qq.com/document/pa… 不需要调用ww.register&#xff0c;直接调用ww.createWWLoginPanel即可创建企业微信登录面板 - 文档 - 企业微信开发者中心 (qq.com) 引入 //通过 npm 引入 npm install wecom/jssdk import * as ww from we…

登陆harbor发现证书是错误的, 那么如何更新harbor的证书呢

Error response from daemon: Get "https://172.16.21.35/v2/": tls: failed to verify certificate: x509: certificate is valid for 127.0.0.1, ::1, 172.16.21.30, not 172.16.21.35 版本 v2.10.1-b7b88476 不需要从头看, 直接看最下面的成功的证书创建 这里面首…

外观模式的理解和实践

外观模式&#xff08;Facade Pattern&#xff09;是一种常用的软件设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。该模式定义了一个高层的接口&#xff0c;使得子系统更容易使用。简单来说&#xff0c;外观模式就是通过引入一个外观角色…

excel使用笔记

1.工作表1计算工作表2某列的和 假设我们有两个工作表&#xff0c;分别命名为“Sheet1”和“Sheet2”&#xff0c;我们想要求和这两个工作表中A1到A**单元格的数据&#xff0c;可以在任意一个工作表的单元格中输入以下公式&#xff1a; SUM(Sheet1!A1:A10, Sheet2!A1:A10) SUM…

《应用导航设计:裂变式路由风暴来袭》——HarmonyOS开发项目时的Navigation路由奇妙使用

文章目录 应用导航设计引言概述场景示例基本实现推荐方案路由管理模块的实现页面跳转实现 业务实现中的关键点动态加载路由栈管理 应用导航设计 引言 在大型应用开发中&#xff0c;如何高效地设计应用导航&#xff0c;处理多模块间的路由跳转与解耦&#xff0c;始终是一个关键…

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库基本信息数据库配置设置密码控制台开启…

XSLT 编辑 XML

XSLT 编辑 XML 介绍 XSLT&#xff08;可扩展样式表语言转换&#xff09;是一种用于转换XML文档的语言。它允许开发人员将XML数据转换为其他格式&#xff0c;如HTML、PDF或纯文本。XSLT通过使用XPath查询来定位XML文档中的元素&#xff0c;并对这些元素应用转换规则。在本教程…

thinkphp8自带分页bootstrap

tp8引用的是bootstrap3.4.1这个版本&#xff1b; 前端结构&#xff1a; <ul class"pagination"><li><a href"/index.php?page4"></a></li><li><a href"/index.php?page1">1</a></li>…

win服务器的架设、windows server 2012 R2 系统的下载与安装使用

文章目录 windows server 2012 R2 系统的下载与安装使用1 windows server 2012 的下载2 打开 VMware 虚拟机软件&#xff08;1&#xff09;新建虚拟机&#xff08;2&#xff09;设置虚拟机&#xff08;3&#xff09;打开虚拟机 windows server 2012&#xff08;4&#xff09;进…

如何在谷歌浏览器中开启安全浏览

在数字化时代&#xff0c;网络安全变得愈发重要。作为全球最受欢迎的网络浏览器之一&#xff0c;谷歌浏览器提供了多种功能来保护用户的在线安全。本文将详细介绍如何在谷歌浏览器中开启安全浏览&#xff0c;并额外提供一些有用的页面滚动设置、地址栏快捷搜索和跟踪防护的相关…

djiango DRF的使用

djiango DRF的使用 一 、初始 DRF序列化环境安装环境配置数据模型定义定义DRF序列化模型对象 二 、DRF请求和响应请求对象&#xff08;Request objects&#xff09;响应对象&#xff08;Response objects&#xff09;状态码&#xff08;Status codes&#xff09;包装&#xff0…

如何使用 Python 连接 PostgreSQL 数据库?

在Python开发中&#xff0c;连接PostgreSQL数据库是一个常见的需求。 我们可以使用多种库来实现这一功能&#xff0c;其中最常用的是psycopg2。 下面我将详细介绍如何使用psycopg2来连接PostgreSQL数据库&#xff0c;并提供一些实际开发中的建议和注意事项。 1. 使用 psycop…

计算机网络-HTTP协议

HTTP HTTP是一种不保存状态&#xff0c;即无状态的协议。HTTP协议自身不对请求和响应之间的通信进行保存。为了保存状态因此后面也有一些技术产生比如Cookies技术。 HTTP是通过URI定位网上的资源&#xff0c;理论上将URI可以访问互联网上的任意资源。 如果不是访问特定的资源…