iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何实现动态规划进阶
  • 693
分享到

如何实现动态规划进阶

2023-06-15 12:06:58 693人浏览 八月长安
摘要

本篇内容介绍了“如何实现动态规划进阶”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!案例 1问:给定一个包含非负整数的 m x n 网格,请找

本篇内容介绍了“如何实现动态规划进阶”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

如何实现动态规划进阶

案例 1

问:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小,其中 arr[m][n]  表示具体的值。每次只能向下或者向右移动一步。

思考

我们依次进行相关的步骤:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 定义变量:我们定义从左上角走到(i, j) 这个位置时,最小的路径和是 dp[i - ][j - 1]。那么,dp[m-1] [n-1]  就是我们要的答案;

  3. 寻找关系:dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + arr[i][j]; arr[i][j]  表示网格中的数值,到达当前格子的最小路径等于左边或者上边中较小的路径加上格子本身的数值;

  4. 定义初始值:dp[i][0] = dp[i-1][0] + arr[i][0];,dp[0][i] = dp[0][i-1] +  arr[0][i];;第一行或者第一列的时候就是整行和整列的数值累加。

编码

上面的分析可以想到,那么接下来我们就需要用代码来实现了,对于需要使用到之前的记录,我们可以考虑用二维数组来记录,所以就有了下面的这段代码。

public int dp(int[][] arr) {     int m = arr.length;    int n = arr[0].length;     if (m <=0 || n <= 0) {         return 0;     }     int[][] dp = new int[m][n];     // 初始化    dp[0][0] = arr[0][0];    // 初始化最左边的列    for(int i = 1; i < m; i++){       dp[i][0] = dp[i-1][0] + arr[i][0];     }    // 初始化最上边的行    for(int i = 1; i < n; i++){       dp[0][i] = dp[0][i-1] + arr[0][i];     }          for (int i = 1; i < m; i++) {         for (int j = 1; j < n; j++) {             dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + arr[i][j];         }     }     return dp[m - 1][n - 1]; }

解释下上面的代码,首先我们创建了一个二维数组  dp[m][n],用于记录到达位置的最短路径,由于当前的路径是由左边或者上边的最小路径加上当前格子的数值得到。这里我们需要找到对应关系,也就是dp[i][j]  = min(dp[i-1][j],dp[i][j-1]) + arr[i][j],这里我们需要取相邻的最小值再加上当前格子的数值。

案例 2

问:给定不同面额的硬币 coins 和一个总金额  amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回  -1。你可以认为每种硬币的数量是无限的。LeetCode 322. 零钱兑换。

思考

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 定义变量:定义 dp[i] 表示凑成金额i,所需要的最少硬币个数,即 dp[amount] 则是我们需要求解的;

  3. 寻找关系:假设我们有三种硬币a,b,c,兑换的金币数为 m,我们可以推出 dp[m] = min(dp[m - a], dp[m - b], dp[m -  c]) + 1,因为如果我们是需要求 m 金额的最少硬币个数,如果我们求出了 m - a 金额需要的硬币个数,在加上一个 a 就可以得到 m,硬币个数只要加  1。其实b,c 同理。并且我们需要取所有硬币种类的最小数。

  4. 定义初始值:dp[0] = 0,没有金额当时也不需要硬币个数,dp[i - coins[j] 需要有解;

编码

public int dp(int[] coins, int amount) {          int[] dp = new int[amount + 1];         int size = coins.length;         int i = 0;         int j = 0;      # 定义初始值         dp[0] = 0;         for (i = 1; i <= amount; i++) {             #赋值,当不能组合和输出 -1 判断使用             dp[i] = Integer.MAX_VALUE;            # 遍历 coins 中的硬币种类             for (j = 0; j < size; j++) {                 if (i >= coins[j] && (dp[i - coins[j]]) != Integer.MAX_VALUE) {                     dp[i] = Math.min(dp[i - coins[j]] + 1, dp[i]);                 }             }         }         if (dp[amount] == Integer.MAX_VALUE) {             dp[amount] = -1 ;         }         return dp[amount];     }

“如何实现动态规划进阶”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何实现动态规划进阶

本文链接: https://www.lsjlt.com/news/280183.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何实现动态规划进阶
    本篇内容介绍了“如何实现动态规划进阶”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!案例 1问:给定一个包含非负整数的 m x n 网格,请找...
    99+
    2023-06-15
  • C++实现动态规划过程详解
    目录C++实现动态规划1. 动态规划的基础2. 动态规划的实现方法3. 实际应用C++实现动态规划 动态规划是解决一类最优问题的常用方法,它是解决最优化问题的一种途径,因为这种算法通...
    99+
    2023-05-20
    C++实现动态规划 C++动态规划
  • Java实现动态规划背包问题
    目录前言一、原理1.1 最优子结构性质1.2 递归关系二、算法描述2.1 算法描述2.2 图解2.3 构造最优解三、 0 − 1 0-1 0−1 背包问题相关...
    99+
    2024-04-02
  • C++动态规划算法如何使用
    这篇“C++动态规划算法如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++动态规划算法如何使用”文章吧。Fibon...
    99+
    2023-06-29
  • python实现动态规划算法的示例代码
    动态规划(Dynamic Programming,DP)是一种常用的算法思想,通常用于解决具有重叠子问题和最优子结构性质的问题。动态规划算法通常是将问题分解为子问题,先解决子问题,再...
    99+
    2023-02-16
    python 动态规划算法
  • C++动态规划算法实现矩阵链乘法
    问题描述: 给定n个矩阵的链<A1,A2,…,An>,矩阵Ai的规模为p(i-1)×p(i) (1<=i<=n),求完全括号化方案,...
    99+
    2024-04-02
  • Java算法之BFS,DFS,动态规划和贪心算法如何实现
    本篇内容主要讲解“Java算法之BFS,DFS,动态规划和贪心算法如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java算法之BFS,DFS,动态规划和贪心算法如何实现”吧!广度优先搜索...
    99+
    2023-07-05
  • 【路径规划】局部路径规划算法——DWA算法(动态窗口法)|(含python实现 | c++实现)
    文章目录 参考资料1. DWA算法原理1.1 简介1.2 算法原理1. 速度采样2. 轨迹预测(轨迹推算)3. 轨迹评价 2. Python实现2.1 参数配置2.2 机器人运动学模...
    99+
    2023-08-31
    python 机器人 路径规划 DWA 动态窗口法
  • Java动态规划之如何编辑距离问题
    这篇文章给大家分享的是有关Java动态规划之如何编辑距离问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所...
    99+
    2023-05-30
    java
  • Java动态规划之硬币找零问题实现代码
    动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,并将这些子问题的解保存起来,如果以后在求解较大子问题的时候需要用到这些子问题的解,就可以直接取出这些已经计算过的解而免去重复运算。保存子问题的解可以使用填表方式,例如保存在数...
    99+
    2023-05-30
    java 算法 硬币找零
  • Java动态规划之硬币找零问题实现示例
    目录问题描述:问题分析:具体的过程如下:动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20...
    99+
    2022-11-13
    Java 硬币找零
  • C++动态规划实现查找最长公共子序列
    目录最长公共子序列代码实现结果最长公共子序列 最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。一个数列 ,如果分别是两个或多个已知...
    99+
    2024-04-02
  • Python怎么实现最大连续区间和动态规划
    本篇内容介绍了“Python怎么实现最大连续区间和动态规划”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题描述:给定一段长度为N的整数序列...
    99+
    2023-06-26
  • python中如何实现线性规划
    python中如何实现线性规划,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。说明图解法,用几何绘图的方法,求出最优解。中学就讲过这种方法,在经济学研究中非常常用...
    99+
    2023-06-20
  • Python动态规划实现虚拟机部署的算法思想
    声明 本文章为个人拙见,仅仅提供参考,不一定正确,各位大佬可以发表自己的意见。 题目描述 考虑到在虚拟机部署中资源提供商通常希望自己的收益最大化,现假设有一台宿主机,共有x个cpu和...
    99+
    2024-04-02
  • PHP怎么使用动态规划实现最优红包组合
    这篇文章主要介绍“PHP怎么使用动态规划实现最优红包组合”,在日常操作中,相信很多人在PHP怎么使用动态规划实现最优红包组合问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP怎么使用动态规划实现最优红包组合...
    99+
    2023-06-20
  • 动态规划之使用备忘录来改进Javascript函数
    目录什么是备忘录备忘录的概念1.引用透明2.查找表比较函数使用备忘录和不用备忘录解决方法是记录调用函数的返回结果备忘录的意义结论:什么是备忘录前言; 动态规划已出现了十多年。根据维基...
    99+
    2024-04-02
  • Java动态规划之丑数问题实例讲解
    问题描述: 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 注: 1也是丑数 思路: 我们来分析一下丑数如何得到,肯...
    99+
    2024-04-02
  • Teradata中如何进行容灾规划和实施
    在Teradata中进行容灾规划和实施通常涉及以下步骤: 确定容灾需求:首先要确定业务需求和对数据的容灾要求,包括数据的备份、恢...
    99+
    2024-04-09
    Teradata
  • 怎么使用C++动态规划算法实现矩阵链乘法
    这篇文章主要介绍“怎么使用C++动态规划算法实现矩阵链乘法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用C++动态规划算法实现矩阵链乘法”文章能帮助大家解决问题。问题描述:给定n个矩阵的链&...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作