算法---动态规划

news2024/9/25 13:13:32

动态规划

  • 1.前言
  • 2. 斐波那契数列模型
    • 示例 - 第N个泰波那契数
    • 2.1 算法原理(重点)
    • 2.2 代码
  • 3. 路径问题
  • 4. 简单多状态 dp 问题
  • 总结解题思路

1.前言

哪些情况下会用到动态规划:

1.最优化问题:当需要求解最大值或最小值的问题时,可以考虑使用动态规划。例如,最长递增子序列、最短路径问题等。

2.问题具有重叠子问题性质:如果问题的解可以由其子问题的解构成,并且子问题之间存在重叠,即同一个子问题会被多次求解,那么可以使用动态规划。通过将子问题的解保存下来,避免重复计算,提高效率。

3.问题具有最优子结构性质:如果问题的最优解可以由其子问题的最优解推导得出,那么可以使用动态规划。通过递推关系式,将问题分解为子问题,并利用子问题的最优解来构造原问题的最优解。

4.求解过程具有重叠子结构性质:如果问题的求解过程中,需要多次用到相同的中间结果,那么可以使用动态规划。通过保存中间结果,避免重复计算,提高效率。

5.多阶段决策问题:当问题可以划分为多个阶段,并且每个阶段的决策依赖于之前阶段的决策结果时,可以使用动态规划。通过定义状态和状态转移方程,逐步求解每个阶段的最优解。

2. 斐波那契数列模型

示例 - 第N个泰波那契数

题目地址:点这里

在这里插入图片描述

2.1 算法原理(重点)

在这里插入图片描述
空间优化(选):

  • 背包问题
  • 滚动数组

在这里插入图片描述


1. 创建一个长度为38的数组arr,用于存储计算过程中的中间结果。数组的下标表示泰波那契数的序号,数组元素存储对应序号的泰波那契数的值。

2. 初始化数组的前三个元素arr[0]、arr[1]和arr[2]分别为0、1、1,这是泰波那契数列的起始值。

3. 如果n小于等于2,直接返回arr[n],即泰波那契数列的前三个数。

4. 从i=3开始,通过循环填充数组arr的剩余元素。对于每个i,计算泰波那契数arr[i]的值,它等于前三个数的和arr[i-3] + arr[i-2] + arr[i-1]。

5. 循环结束后,数组arr中的所有泰波那契数都已计算得到。

6. 返回arr[n],即第n个泰波那契数的值。


2.2 代码

class Solution {
public:
    int tribonacci(int n) {
        //1.创建dp表
        int arr[38]={0};
        //2.初始化
        arr[0]=0,arr[1]=1,arr[2]=1;
        
        if(n<=2) return arr[n];
        
        int temp=0;
        //3.填表
        for(int i=3;i<=n;i++)
        {
            temp=arr[i-3]+arr[i-2]+arr[i-1];
            arr[i]=temp;
        }
        //4.返回值
        return arr[n];
    }
};

3. 路径问题

动态规划(Dynamic Programming)是一种常用的解决优化问题的算法思想,它可以用于求解路径问题。路径问题通常是指在一个图或者矩阵中找到从起点到终点的最优路径,路径上可能会有一些限制条件或者权重。

下面我将介绍一个经典的动态规划路径问题——最短路径问题(Shortest Path Problem),以帮助你理解动态规划在路径问题中的应用。

最短路径问题是指在一个加权有向图中找到从起点到终点的具有最小权重和的路径。这里使用动态规划的思想来解决该问题,具体步骤如下:

  1. 创建一个二维数组 dp,其中 dp[i][j] 表示从起点到达坐标 (i, j) 的最短路径权重和。
  2. 初始化 dp 数组,将所有位置的值初始化为正无穷大。
  3. 设置起点的路径权重为 0,即 dp[start_x][start_y] = 0
  4. 从起点开始进行动态规划计算,遍历图中的每个位置 (i, j)
  • 对于位置 (i, j),我们可以通过上一个位置的最短路径来计算当前位置的最短路径。
  • 计算方式为 dp[i][j] = min(dp[i][j], dp[i-1][j] + weight[i][j]),其中 weight[i][j] 表示从上一个位置到当前位置的权重
  • 同理,还需要考虑从左边的位置到当前位置的权重:dp[i][j] = min(dp[i][j], dp[i][j-1] + weight[i][j])
  1. 最终,dp[end_x][end_y] 即为从起点到终点的最短路径权重和。

上述步骤描述了如何使用动态规划求解最短路径问题。当然,具体问题的求解方法可能会有所不同,取决于问题的具体要求和限制条件。你可以根据实际情况进行调整和扩展。

相关练习题:
(不同路径2)
(下降路径最小和)


4. 简单多状态 dp 问题

在动态规划中,有一类常见的问题被称为多状态动态规划问题(Multiple State DP Problems),也被称为简单多状态 DP 问题。这类问题中,我们需要维护多个状态变量,并根据这些状态变量的转移关系来求解最优解。

以下是一个简单的多状态动态规划问题的示例:背包问题(Knapsack Problem)。

背包问题是一个经典的优化问题,可以分为 0-1 背包和完全背包两种情况。这里以 0-1 背包问题为例进行说明。

问题描述:
假设有一个背包,容量为 C。现有 n 个物品,每个物品有两个属性:重量 w[i] 和价值 v[i]。要求在不超过背包容量的前提下,选择物品放入背包,使得背包中物品的总价值最大。

解决思路:

  1. 创建一个二维数组 dp,其中 dp[i][j] 表示在前 i 个物品中,背包容量为 j 时的最大总价值。
  2. 初始化 dp 数组,将所有位置的值初始化为 0。
  3. 从前往后遍历物品,对于每个物品 i,遍历背包容量 j。
  • 若物品 i 的重量 w[i] 大于当前背包容量 j,则无法将物品 i 放入背包,因此 dp[i][j] = dp[i-1][j],即当前状态的最优解与前一个物品的最优解相同。
  • 若物品 i 的重量 w[i] 小于等于当前背包容量 j,则可以选择将物品 i 放入背包或不放入背包。两种情况下的最优解分别为:
    • 放入物品 i:dp[i][j] = dp[i-1][j-w[i]] + v[i],即在剩余容量为 j-w[i] 时的最优解再加上物品 i 的价值 v[i]。
    • 不放入物品 i:dp[i][j] = dp[i-1][j],即当前状态的最优解与前一个物品的最优解相同。
  • 取两种情况下的最大值,即 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])。
  1. 最终,dp[n][C] 即为在前 n 个物品中,背包容量为 C 时的最大总价值。

上述步骤描述了如何使用动态规划求解 0-1 背包问题,其中涉及到了两个状态变量:物品的编号 i 和背包的容量 j。根据实际问题的不同,多状态动态规划问题可能会有更多的状态变量,并相应地设计状态转移方程。


总结解题思路


  1. 状态表示
  2. 状态转移方程
  3. 初始化
  4. 填表顺序
  5. 返回值

在这里插入图片描述

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

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

相关文章

LiteFlow逻辑流引擎集成验证

本文将介绍开源逻辑流组件LiteFlow的架构、设计思想和适用场景&#xff0c;如何基于springboot集成LiteFlow&#xff0c;并验证DSL多种逻辑流程&#xff0c;以及逻辑流设计器的开发思路。 一、逻辑流解决什么问题 在每个公司的系统中&#xff0c;总有一些拥有复杂业务逻辑的系…

regexp_substr()

1、基本语法 REGEXP_SUBSTR(String, pattern, position,occurrence, modifier) String&#xff1a;需要进行处理的字符串。 pattern&#xff1a;正则表达式。 position&#xff1a;起始位置&#xff08;从字符串的第几个开始&#xff0c;默认为1&#xff0c;注&#xff1a;…

C++多重继承与虚继承

多重继承的原理 多重继承(multiple inheritance)是指从多个直接基类中产生派生类的能力。 多重继承的派生类继承了所有父类的属性。 在面向对象的编程中&#xff0c;多重继承意味着一个类可以从多个父类继承属性和方法。 就像你有一杯混合果汁&#xff0c;它是由多种水果榨取…

任务2.1 一元二次方程(顺序结构版)

在这个任务中&#xff0c;我们编写了一个Java程序来解决一元二次方程。程序接受用户输入的系数a、b、c&#xff0c;并计算出方程的根。通过计算判别式delta的值&#xff0c;我们可以确定方程有两个不相等实根、两个相等实根还是没有实数根。这个程序遵循了IPO模式&#xff0c;即…

Linux split分割xls或csv文件

文件名&#xff1a;test.xls split -a 2 -d -l 100 test.xls test-a 2&#xff1a;后缀是2位 -d&#xff1a;后缀数字 -l 100 &#xff1a;每100行一个文件 test.xls&#xff1a;需要分割的文件名 test&#xff1a;分割后的文件前缀批量修改文件后缀 for i in test*; do mv $…

探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较

title: 探索多种数据格式&#xff1a;JSON、YAML、XML、CSV等数据格式详解与比较 date: 2024/3/28 17:34:03 updated: 2024/3/28 17:34:03 tags: 数据格式JSONYAMLXMLCSV数据交换格式比较 1. 数据格式介绍 数据格式是用于组织和存储数据的规范化结构&#xff0c;不同的数据格…

蓝桥杯每日一题(floyd算法)

4074 铁路与公路 如果两个城市之间有铁路t11&#xff0c;公路就会t2>1,没铁路的时候t1>1,公路t21。也就是公路铁路永远都不会相等。我们只需要计算通过公路和铁路从1到n最大的那个即可。 floyd是直接在数组上更新距离。不需要新建dis数组。另外一定要记得把邻接矩阵初始…

探索云原生时代:技术驱动的业务架构革新

一、引言 在数字化浪潮中&#xff0c;云原生技术已成为推动企业快速创新的重要动力。本文将深入探讨云原生的核心理念、技术架构以及其在实际业务环境中的应用&#xff0c;带领读者深入理解云原生技术的复杂性和优势。 云原生技术的定义 云原生&#xff08;Cloud Native&#x…

慧天[HTWATER]:采用CUDA框架实现耦合模型并行求解

慧天[HTWATER]软件简介 针对城市排水系统基础设施数据管理的需求&#xff0c;以及水文、水力及水质模拟对数据的需求&#xff0c;实现了以数据库方式对相应数据的存储。可以对分流制排水系统及合流制排水系统进行地表水文、管网水力、水质过程的模拟计算。可以对城市低影响开发…

“人工智能+”国家战略会带来哪些机会?

一、“人工智能”战略背景 2024年的中国政府工作报告首次引入了“人工智能”的概念&#xff0c;这是国家层面对于人工智能技术和各行业深度融合的重要战略举措。这一概念的提出意味着我国将进一步深化人工智能技术的研发应用&#xff0c;并积极推动人工智能与经济社会各领域的…

ida调试技巧-通过修改zf寄存器的值绕过简单反调试

参考本篇->OllyDbg笔记-对标志寄存器中ZF的理解&#xff08;逆向方面&#xff09;_零标志位zf怎么判断-CSDN博客 不想看也没关系&#xff0c;蒟蒻博主概述一下&#xff0c;总之&#xff0c;在机器执行汇编指令时&#xff0c;标志&#xff08;flag&#xff09;寄存器中的一个…

C++自主点餐系统

一、 题目 设计一个自助点餐系统&#xff0c;方便顾客自己点餐&#xff0c;并提供对餐厅销售情况的统计和管理功能。 二、 业务流程图 三、 系统功能结构图 四、 类的设计 五、 程序代码与说明 头文件1. SystemMap.h #pragma once #ifndef SYSTEMMAP #define SYSTEMMAP #in…

kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)

K8S集群搭建&#xff08;1 master 2 worker&#xff09; 一、环境资源准备1.1、版本统一1.2、k8s环境系统要求1.3、准备三台Centos7虚拟机 二、集群搭建2.1、更新yum&#xff0c;并安装依赖包2.2、安装Docker2.3、设置hostname&#xff0c;修改hosts文件2.4、设置k8s的系统要求…

常见的三种办公室租赁方式各自优缺点

商业办公的租赁市场。找商业办公地点&#xff0c;跟找住宅租房有点像&#xff0c;但目的和要求不同。主要也是三种方式&#xff1a;直接找房东租、接手别人的转租&#xff0c;或者找中介帮忙。每种方式都有它的小窍门和注意事项。 直租 直租商业办公&#xff0c;就是直接和办公…

YoloV5改进策略:Neck和Head改进|ECA-Net:用于深度卷积神经网络的高效通道注意力|多种改进方法|附结构图

摘要 本文使用ECA-Net注意力机制加入到YoloV5Neck和Head中。我尝试了多种改进方法&#xff0c;并附上改进结果&#xff0c;方便大家了解改进后的效果&#xff0c;为论文改进提供思路。&#xff08;改进中。。。。&#xff09; 论文&#xff1a;《ECA-Net&#xff1a;用于深度…

Python实现一个简单的银行管理系统GUI应用

介绍 在本教程中&#xff0c;我们将创建一个基本的银行管理系统GUI应用&#xff0c;用户可以通过图形界面执行各种银行操作。我们将使用Python编程语言和Tkinter库来实现此应用。 使用说明 需要安装Python解释器&#xff0c;以及PythonCharm &#x1f449; 点我去下载 效果图…

Mysql的连接与存储

目录 一、mysql的连接查询 1、连接的分类&#xff1a; 1.1 内连接 1.2左连接 1.3 右连接 二、存储过程 1、简介 2、优点 3、语法 4、参数分类 5、带参数的存储过程 6、修改存储过程 7、删除存储过程 三、总结 一、mysql的连接查询 mysql的连接查询&#xff0c;通…

tomcat和Servlet开发小案例

在上篇文章中,我已经正确安装了tomcat和利用servlet写了个基础的hello world程序,明白了这两个东西到底是啥玩意. 接下来,需要写个登录的小案例来进一步熟悉下基于servlet开发的流程. 一,新建项目 我们新建的maven项目其实里面是空的。所以我们需要给他变成一个servlet项目。 …

vue3全局引入element-plus使用Message教程

文章目录 安装引入 Element Plus和组件样式示例注意安装与引入&#xff1a;按需引入&#xff1a;API 使用&#xff1a;样式问题&#xff1a;组件上下文&#xff1a;版本兼容性&#xff1a;错误处理&#xff1a; 这是 Element UI 的 Vue 3 版本。ElMessage 是 Element Plus 中的…

编程语言|C语言——C语言变量的存储方式

前言 变量是程序中数据的存储空间的抽象。变量的存储方式可分为静态存储和动态存储两种。 静态存储变量通常是在程序编译时就分配一定的存储空间并一直保持不变&#xff0c;直至整个程序结束。在上一部分中介绍的全局变量的存储方式即属于此类存储方式。 动态存储变量是在程序执…