【算法排序】动态规划

news2024/11/20 23:36:19

目录

  • 一、动态规划思想
  • 二、动态规划与分治法的区别
    • 1、共同点
    • 2、不同点
  • 三、动态规划特征
    • 1、最优子结构
    • 2、重叠子问题
  • 四、动态规划求解问题的基本步骤
  • 五、斐波那契数分析
  • 六、实现思路
  • 七、代码实现

一、动态规划思想

将待求问题划分为若干个子问题,按划分的顺序求解子阶段问题,前一个子问题的解,为后一个子问题的求解提供了有用的信息(最优子结构)。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其它局部解。依次解决各个子问题,最后求出原问题的最优解

二、动态规划与分治法的区别

1、共同点

二者都是求原问题具有最优子结构性质,都是将原问题分而治之,分解成若干个规模较小的子问题,然后将子问题的解合并,形成原问题的解

2、不同点

1、分治法:将问题分解成子问题后,通常是将子问题的解合并起来得到原问题的解
2、动态规划法:是先解决子问题,将子问题的解保存下来,最后根据子问题的解计算得到原问题的解

三、动态规划特征

1、最优子结构

问题的最优解是由最优子问题的最优解推出的,也就是问题的最优解包含了子问题的最优解
在这里插入图片描述
如图:若路线I和J是A到C的最优路径,则根据最优化原理,路线J必是从B到C的最优路线。
反证法证明: 假设有另一路径J是B到C的最优路径,则A到C的路径取I和J比I和J更优,矛盾:从而证明J`必是B到C的最优路径。最优化原理是动态规划的基础,任何问题,如果失去了最优化原理的支持,就不可能用动态规划方法计算哪些问题满足最优化原理

2、重叠子问题

在用递归算法自顶向下解问题时,每次产生的子问题并不是总是新问题。有些子问题被反复计算多次。斐波那契数列问题就存在重叠子问题。在递归实现中,当计算F(n)时,会先计算F(n-1)和F(n-2),而计算F(n-1)时又会先计算F(n-2)和F(n-3),这样就会出现重复计算的情况。

四、动态规划求解问题的基本步骤

动态规划所处理的问题是一个多阶段决策的问题,一般由初始状态开始,通过中间阶段决策的选择,达到结束状态。动态规划算法的代码设计都有一定的模式。一般经过以下几个步骤:
初始状态->决策1->决策2->…->决策n->结束状态

  1. 找出最优解的性质,并刻画其结构特征(找问题状态)
  2. 递归地定义最优值(找状态转移方程)
  3. 自底向上地方式计算最优值
  4. 根据计算最优值时得到的信息,构造最优解

五、斐波那契数分析

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
给定 N,计算 F(N)。

序列为:0、1
下标为:2
解释:F(2) = F(N - 1) + F(N - 2)= F(2 - 1) + F(2 - 2)=1+0 = 1
下标2的值为:1
序列为:0、1、1

在这里插入图片描述
数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和(示意图如下)
在这里插入图片描述

六、实现思路

  1. 定义一个要求的斐波那契数
  2. 判断求的斐波那契数是否小于等于1,是的话直接返回求的斐波那契数,否的话,则创建一个数组,用来记录子问题的解
  3. 初始化第一个斐波那契数值,和第二个斐波那契数值。求第三个斐波那契数值的时候,把前两个下标的值进行相加,得出第三个斐波那契的数值。依次按照这种方式,最终得出需要求的斐波那契数值

七、代码实现

public class Fibonacci {

    public static void main(String[] args) {
        int numberArr = 10; // 求第10个斐波那契数
        int result = fibonacci(numberArr); // 第10个斐波那契数的值
        System.out.println("第10个斐波那契数值为:"+ result); // 输出第10个斐波那契数的值
    }
    /**
    * 斐波那契数列的动态规划算法
    * @paramn  第numberArr个斐波那契数,dp为数据处理后的值
    * @return 第numberArr个斐波那契数的值
    */
    public static int fibonacci(int numberArr) {
        if (numberArr <= 1) {
            // 当numberArr小于等于1时,直接返回numberArr
            return numberArr;
        }

        //创建数组,用于记录子问题的解
        //dp为数据处理后的值
        int[] dp = new int[numberArr + 1];
        dp[0] = 0; // 初始化第一个数
        dp[1] = 1; // 初始化第二个数

        // 递推求解子问题
        for (int i = 2; i <= numberArr; i++) {
            //dp[i]:i为该求下标的值
            //dp[i-1]:i为该求下标-1的值
            //dp{[i-2]:i为该求下标-2的值
            //算出两个下标的值后进行相加,最后得出该求下标的值
            dp[i] = dp[i - 1] + dp[i - 2];
            System.out.println("第"+i+"轮numberArr的值为"+ dp[i]);
        }
        // 返回第numberArr个斐波那契数的值
        return dp[numberArr];
    }
}

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

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

相关文章

为什么袁隆平的英语这么好?这才是学到老的典范!

文 / 冰雪&#xff08;微信公众号&#xff1a;王不留&#xff09; 2021年5月22日13时07分&#xff0c;“共和国勋章”获得者、中国工程院院士、国家杂交水稻工程技术研究中心主任、湖南省政协原副主席袁隆平&#xff0c;因病逝世&#xff0c;享年91岁。 一晃两年过去了。袁隆平…

iTOP-RK3568开发板编译瑞芯微原厂源码

1 输入以下命令设置 java 版本为 1.8 版本&#xff0c;确认 java 版本是 1.8 版本之后&#xff0c;才可以进行下一步编译&#xff0c;如下图所示&#xff1a; source javaenv.sh java -version 2 输入命令配置 Android 分支 source build/envsetup.sh lunch rk3568_r-user…

【软考】系统集成项目管理工程师 第3章 信息系统集成专业技术知识

文章目录 3.1 信息系统建设3.1.1 信息系统的生命周期3.1.2信息系统开发方法 3.3 软件工程3.3.1软件需求分析与定义3.3.2软件设计、测试与维护3.3.3软件质量保证及质量评价3.3.4软件配置管理3.3.5软件过程管理3.3.6软件开发工具3.3.7软件复用 3.4 面向对象系统分析与设计3.4.1面…

ESP32-WROOM-32 TCP通讯AT指令例程

ESP32-WROOM-32 AT指令配置TCP通讯 ESP32-WROOM-32前言固件烧录测试AT指令TCP通讯\透传ESP32配置SoftAPESP32作TCP Client连接TCP Server通讯/透传普通传输模式演示WIFI透传演示 ESP32做TCP Server连接TCP Client通讯演示 ESP32-WROOM-32 前言 软硬件准备&#xff1a; ESP32-W…

自动驾驶行业迎来大规模发展,“高精度定位”重要性凸显

5月16日&#xff0c;2023 中国 (亦庄) 智能网联汽车科技周暨第十届国际智能网联汽车技术年会在北京隆重召开。工信部装备工业一司一级巡视员苗长兴在在会上表示&#xff1a;2022 年我国搭载辅助自动驾驶系统的智能网联乘用车新车销售量达 700 万辆&#xff0c;同比增长45.6%&am…

计算机操作系统(慕课版)第三章课后题答案

一、简答题 1.高级调度与低级调度的主要任务是什么&#xff1f;为什么要引入中级调度&#xff1f; 1&#xff09;高级调度的主要任务是将外存的作业调入内存&#xff0c;又称作业调度&#xff1b; 低级调度的主要任务数为内存中处于就绪态的作业分配处理机。 2&#xff09;为了…

小航助学2023年3月GESP_C++二级试卷(含题库答题软件账号)

GESP在线模拟训练系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手 答案:D 第1题以下存储器中的数据不会受到附近强磁场干扰的是&#xff08; &#xff09;。 A、硬盘B、U 盘C…

共享单车之数据存储-获取工作簿中的数据

第1关&#xff1a;获取工作簿中的数据 任务描述 本关任务&#xff1a;获取data.xls文件中的数据。 相关知识 获取工作簿中的信息&#xff0c;我们可以使用Java POI&#xff08;POI是一个提供API给Java程序对Microsoft Office格式档案读和写的功能&#xff09;提供的Workboo…

二十三种设计模式第七篇--适配器模式

适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于 结构型模式&#xff0c;它结合了两个独立接口的功能。这种模式涉及到一个单一的类&#xff0c;该类负责加入独立的或不兼容的接口功能。 我们生活中…

注意!ChatGPT的Plus账号也会被封禁

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 最近经常看到有人丢个截图&#xff0c;然后悲伤地说&#xff0c;ChatGPT账号被封了。 这不是账号被封&#xff0c;而是所用的代理节点被OpenAI封了&#xff0c;换个节点即可。 这个截图才是账号真正被封的提示&…

LeetCode 1080. 根到叶路径上的不足节点

【LetMeFly】1080.根到叶路径上的不足节点 力扣题目链接&#xff1a;https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/ 给定一棵二叉树的根 root&#xff0c;请你考虑它所有 从根到叶的路径&#xff1a;从根到任何叶的路径。&#xff08;所谓一个叶子…

使用GPT-4.0编写量化交易策略:方法、案例与参数优化

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 『正文』 ˇ 随着人工智能的发展&#xff0c;GPT-4.0已经成为量化交易策略编写的强大工具。在这篇文章中&#xff0c;我们将探讨如何使用GPT-4.0编写量化交易策略&#xff0c;并提供一个实际的案例。我…

Maven基础学习---5、其他核心概念

1、生命周期 1、作用 为了让构建过程自动化完成&#xff0c;Maven设定了三个生命周期。生命周期中的每一个环节对应构建过程中的一个操作。 2、三个生命周期 3、特点 前面三个生命周期彼此都是独立的在任何一个生命周期内部&#xff0c;执行任何一个具体环节的操作&#xff…

ElasticSearch 的DSL查询文档

一、DSL查询文档 本章目标 文本检索&#xff1a;match_all、match、multi_match精确查询&#xff1a;term、range地理坐标查询&#xff1a;geo_distance复合查询&#xff1a;function_score、bool 1. 说明 查询语法&#xff1a; GET /索引库名/_search {"query": {}…

基于C++实现房贷计算器的设计

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 本次项目的要求是完成一个房贷计算器的设计&#xff0c;实现商业贷款、公积金贷款和组合贷款的利息计算三种功能。并且使用Qt或其他的界面库设计人机交互界面&#xff0c;要求界面友好方便使用。并且必须使用面向对象的思想进…

NSS周常刷密码(1)

感觉没怎么做密码,就每周上nss随便做点 稍微难点的会分析 [SWPU 2020]happy import gmpy2 from Crypto.Util.number import * import z3c 0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e e 0x872a335 #q q*p^3 128536731745208998078944182958039785532190189…

ChatGPT 4.0大升级,能替代留学中介吗?

ChatGPT4.0发布了&#xff01; 在之前轰动世界版本的基础上又有了大幅度升级&#xff0c;根据官方介绍&#xff0c;它的输入可以是文字&#xff08;上限2.5万字&#xff09;还可以是图像&#xff0c;是一个超大的多模态模型。 越来越多的人开始好奇这个东西到底能用来做什么&…

CMake Practice 学习笔记三---建立动静态库

任务&#xff1a; 建立一个静态库和动态库&#xff0c;提供HelloFunc函数供其他程序编程使用&#xff0c;HelloFunc向终端输出Hello World字符串。安装头文件与共享库。 1、准备工作 在/backup/cmake目录建立t3目录 mkdir t3建立共享库 cd t3 mkdir lib在t3目录下建立CMak…

【SCI征稿】CCF推荐|Springer旗下2区无线网络类SCI, 2个月左右录用~

一、【期刊简介】 JCR2区无线网络类SCI 【期刊概况】IF: 2.0-3.0&#xff0c;JCR2/3区&#xff0c;中科院4区&#xff1b; 【终审周期】走期刊系统&#xff0c;3个月左右录用; 【检索情况】SCI&EI双检&#xff1b; 【数据库收录年份】1967年&#xff1b; 【自引率】11…

基于最小二乘法的直线拟合原理及C++实现

“ 在数据分析的时候&#xff0c;需要尽可能地排除噪声干扰&#xff0c;以便分析出数据的本质规律。排除噪声干扰的常用手段之一是数据拟合&#xff0c;以直线、抛物线、多次曲线等为数据模型&#xff0c;对数据进行拟合。” 本文我们主要讲基于最小二乘法的直线拟合原理&#…