首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【算法】动态规划 ① ( 动态规划简介 | 自底向上动态规划示例 | 自顶向下动态规划示例 )

文章目录 一、动态规划简介 二、自底向上动态规划示例 1、原理分析 2、算法设计 3、代码示例 三、自顶向下动态规划示例 1、算法设计 2、代码示例 一、动态规划简介 ---- 动态规划 ,..., 判断解在左边还是右边 , 然后在一边再取一个中心点 , 再进行判定 , 该算法有具体步骤 ; 动态规划 , 没有具体步骤 , 只有一个核心思想 ; 动态规划 核心思想 是 由大化小 , 大规模问题...使用 小规模问题 计算结果 解决 , 类似于 分治算法 ; 动态规划 与 贪心算法 区别 : 动态规划 会 为了长远利益 损害当前利益 ; 动态规划 不仅仅 考虑下一步利益 , 还 对 后面十几步甚至几十步进行了大量计算...循环 实现 ; 二、自底向上动态规划示例 ---- 从 下图 数字三角形 中 从上到下 找到一条 最短路径 ; 1、原理分析 自底向上 动态规划思想 : 下面的 n 最佳路径 指的是 以 n...] dp = new int[n][n]; // 动态规划初始化 : 没有办法套入 动态规划方程 中点 进行初始化操作 // 起始点最短路径是其本身

57820

动态规划问题-LeetCode 120(动态内存传递,函数指针,DP)

作者:TeddyZhang,公众号:算法工程师之路 动态规划问题:LeetCode #120 1 编程题 【函数声明与函数指针】 在C++中,函数声明形式为:返回值 函数名称(参数类型 参数名称,...定义函数指针和函数声明有些类似,但有一点不同,在函数指针中,函数名为一个指针变量,如下例子中(*p[2])为一个函数指针数组, 其中p[0] = &max, 相当于对max函数取别名!...】 在下面例子中,其中GetMemory1函数中出现了指针作为函数参数进行传递形式!...第二种思路:既然有了递归式,就可以把暴力递归改成动态规划了!这里说一个原地动态规划解法!...; return triangle[x][y] + min(dfs(x + , y, triangle),dfs(x + , y + , triangle)); } }; 动态规划

67510
您找到你想要的搜索结果了吗?
是的
没有找到

动态规划」命名由来

动态规划」这个名字我个人觉得挺不好(也有可能是翻译锅,哈哈哈),因为这个名字根本不知道它是干嘛。...; 「哈希表」:存在一个「神奇」哈希函数,把一个对象映射到一个整数,只要对象各个属性不变,哈希函数得到整数就不变; 「红黑树」:规定了红色结点、黑色结点以及一些规则; 「B 树」:保持了某种意义上...因此很自然就想到一个问题,为什么会叫「动态规划」。在网上搜索了一下,在维基百科「Dynamic programming」这个词条(注意是英文,不是中文动态规划」)里找到了一点答案。...当然这仅限于我做那些算法问题,因为有一部分使用「动态规划」解决问题的的确确就是在填写一张表格(一维、二维甚至更高维),因此我认为「动态规划核心思想之一还是「空间换时间」。...以前写过一篇文章聊「动态规划」,感兴趣朋友可以看看。 「动态规划」是个什么玩意儿?

82570

动态规划楼层算法

这是一种常用算法,本人摸索出一个规律: /usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/bin/python3.5...:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊...》为名一份数学杂志,用于专门刊载这方面的研究成果。...如果设F(n)为该数列第n项(n∈N*),那么这句话可以写成如下形式::F(n)=F(n-1)+F(n-2) 显然这是一个线性递推数列。...另外斐波那契数列在实际工作中应该用很少,尤其是当数据n很大时候(例如:1000000000),所以综合考虑基本普通非递归O(n)方法就很好了,没有必要用矩阵乘法。

45020

(粗糙笔记)动态规划

动态规划算法框架: 问题结构分析 递推关系建立 自底向上计算 最优方案追踪 背包问题 输入: n 个商品组成集合 O ,每个商品有两个属性 v_i 和 p_i ,分别表示体积和价格 背包容量 C 输出...,优先挑选比值高商品 这三种策略都不能保证得到最优解 蛮力枚举 枚举所有商品组合: 2^n-1 种情况 检查体积约束 递归函数KnapsackSR(h,i,c): 在第 h 个到第 i 个商品中...n\cdot C) 上面带备忘递归和递推求解方法都属于动态规划: 带备忘递归:自顶向下 递推求解:自底向上 最优子结构性质: 问题最优解由相关子问题最优解组合而成 子问题可以独立求解 动态规划与分而治之区别...动态规划 问题结构分析: 给出问题表示: C[i,j] 表示 X[1..i] 和 Y[1..j] 中,以 x_i 和 y_j 结尾最长公共子串 Z[1..l] 长度 递推关系建立:分析最优子结构...,剩余问题变为至多切一刀问题 原始问题不限制切割次数 可能存在最优子结构和重叠子问题 动态规划 问题结构分析: 给出问题表示: C[j] 表示切割长度为 j 钢条可得最大收益 递推关系建立

24240

【算法】动态规划 ③ ( LeetCode 62.不同路径 | 问题分析 | 自顶向下动态规划 | 自底向上动态规划 )

文章目录 一、问题分析 二、自顶向下动态规划 1、动态规划状态 State 2、动态规划初始化 Initialize 3、动态规划方程 Function 4、动态规划答案 Answer 5、代码示例...三、自底向上动态规划 1、动态规划状态 State 2、动态规划初始化 Initialize 3、动态规划方程 Function 4、动态规划答案 Answer 5、代码示例 LeetCode 62...; 在 m x n 网格中 , 只能向右走 或 向下走 ; 将 大规模问题 拆解成 小规模问题 时 , 其依赖关系 是有 方向性 ; 二、自顶向下动态规划 ---- 1、动态规划状态 State...使用 二维数组 dp 保存 动态规划 状态 State , dp[i][j] 表示 从 (0, 0) 位置出发 , 到 (i, j) 位置方案总数 ; 2、动态规划初始化 Initialize 在...---- 1、动态规划状态 State 使用 二维数组 dp 保存 动态规划 状态 State , dp[i][j] 表示 从 (i , j) 位置出发 , 到 (m - 1, n - 1) 位置方案总数

50610

动态规划:不同子序列

115.不同子序列 给定一个字符串 s 和一个字符串 t ,计算在 s 子序列中 t 出现个数。...字符串一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成新字符串。...但相对于刚讲过动态规划:392.判断子序列就有难度了,这道题目双指针法可就做不了了,来看看动规五部曲分析如下: 确定dp数组(dp table)以及下标的含义 dp[i][j]:以i-1为结尾s子序列中出现以...j-1为结尾t个数为dp[i][j]。...每次当初始化时候,都要回顾一下dp[i][j]定义,不要凭感觉初始化。 dp[i][0]表示什么呢? dp[i][0] 表示:以i-1为结尾s可以随便删除元素,出现空字符串个数。

40930

【算法】-直方图水量-动态规划

直方图水量 难度:[困难] 给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图宽度为 1。...上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示直方图,在这种情况下,可以接 6 个单位水(蓝色部分表示水)。感谢 Marcos 贡献此图。...示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 动态规划 1.记录height中每个元素,从左向右扫描并记录右边最大高度; 2.记录height中每个元素,从右向左扫描并记录右边最大高度...; 3.将左右位置元素对比取最小元素,减去数组当前元素高度。...从左向右扫描并记录右边最大高度 从右向左扫描并记录右边最大高度 取高度最小值 Javascript var trap = function (height) { let len = height.length

25620

动态规划:不相交线

同时我在B站更新算法视频,B站同名:代码随想录 1035.不相交线 我们在两条独立水平线上按给定顺序写下 A 和 B 中整数。...这个公共子序列指的是相对顺序不变(即数字4在字符串A中数字1后面,那么数字4也应该在字符串B数字1后面) 这么分析完之后,大家可以发现:本题说是求绘制最大连线数,其实就是求两个字符串最长公共子序列长度...那么本题就和我们刚刚讲过这道题目动态规划:1143.最长公共子序列就是一样一样了。 一样到什么程度呢?把字符串名字改一下,其他代码都不用改,直接copy过来就行了。...其实本题就是求最长公共子序列长度,介于我们刚刚讲过动态规划:1143.最长公共子序列,所以本题我就不再做动规五部曲分析了。...如果大家有点遗忘了最长公共子序列,就再看一下这篇:动态规划:1143.最长公共子序列 本题代码如下: class Solution { public: int maxUncrossedLines

54920

常见动态规划解决思路

期间可以操作是: 插入字符c 耗时O(1) 删除字符c 耗时O(1) 将c更新为c' 如果C和C'是相同,耗时O(0),其它不考虑 字串可以是非连续。...它等效于找两个字符串最大公共字串,比如 HIEROGLYPHOLOGY 和 MICHAELANGELO 最大公共字串为 HELLO 动态规划思路 子问题:X子串X[i:]和Y子串Y[j:]...image.png 思路 image.png 动态规划解决思路 image.png 如何使得词在段落中位置分配合理,使得更美观 给定一个词集合words,使用badness(i,j)表示使用单词是...words[i,j] image.png image.png 暴力解决方案 image.png 动态规划 按照标准动态规划步骤来进行: 找到子问题:集合后缀 words[i:] 假设找到了第一行分隔点...猜测选择数量:<=n-i=O(n)。

40830

NOJ 2364 时光城堡(动态规划)

NOJ 2364 时光城堡 一、题目描述 Input Output Sample Sample Input Sample Output 二、题解 穷举法 动态规划 一、题目描述   时光公主住在魔法城堡中...,松松骑士想去找心仪时光,就必须要费一番功夫,而时光深谙魔法机密,可以在城堡中自由穿梭。...动态规划   因此,这个题不能使用暴力穷举方法进行解答。那该怎么办呢?我们不妨实验一下:假设从开头房间1,一直走到第一次进入房间n+1所需要步数是sum[n],那么sum[n]要怎么算呢?...我们不难发现: sum[n] = sum[n-1] + 从第一次进房间n 到 第一次进入房间n+1 步数 忽略求模运算,从第一次进房间n 到 第一次进入房间n+1 步数是多少?...= i 时,则需要回退1步+(sum[i-1] - sum[p[i]-1])+前进1步即可。

23220

动态规划入门——动态规划与数据结构结合,在树上做DP

如果大家感兴趣可以自行百度背包九讲查看,今天我们来看一个有趣问题,通过这个有趣问题,我们来了解一下在树形结构当中做动态规划方法。...这道题其实有一个非常巧妙办法,我们先不讲,先来看看动态规划怎么解决这个问题。...树形DP 动态规划并不只是可以在数组当中运行,实际上只要满足动态规划状态转移条件和无后效性就可以使用动态规划,无论在什么数据结构当中。...但是这一次我们要在树上进行动态规划,相对来说状态和对应转移会隐蔽一些。没有关系,我会从头开始整理思路,一点一点将推导和思考过程讲解清楚。...这个是动态规划精髓,某种程度上来说它和分治法也比较接近,都存在大问题和小问题之间逻辑上关系。所以当我们面临一个大问题一筹莫展时候,可以借鉴一下分治法,思考一下从小问题入手。

78830

经典博弈问题动态规划解法

动态规划也采用了类似的思路,不过和递归相反,是自底向上从子问题一步步计算到最终问题,通过额外空间来记录状态,避免了子问题重复计算,不过相比递归而言更难理解。...数组每个位置表示在dp[i,j]中,先手可以拿到石头数量和后手可以拿到石头数量,那么我们最后要求解就是dp[0,n]先手拿是不是多过后手拿。...,完全满足动态规划解题思路。...那么最初状态应该是什么样呢? 3.定义基础状态 根据dp定义,很容易知道dp[0,0],dp[1,1]…dp[n,n]即只有一个堆时候,只有先手可以拿到石头,后手拿石头数量是0。...然后根据状态转移规则,可以发现每个需要计算值,就是以表格左边和下边值来计算,每次以对角线方向遍历,直到算出第dp[0,n]值。

36520

100个经典动态规划方程

贪心动态规划2----过河 f=min{{f(i-k)} (not stone) {f(i-k)}+1} (stone); +贪心压缩状态 10.剖分问题4-----多边形-讨论动态规划 F[...f[j]+1;(abs(x-x[j])+abs(y-y[j])<=t-t[j]) 31.树形动态规划3-----贪吃九头龙 32.状态压缩动态规划1-----炮兵阵地 Max(f[Q*(r+1)+k...-f[l1+1,l2,l3,D]; F[l1,l2,l3,D] = Sigma(f[o,p,q,d-1]*f[l1-o,l2-p,l3-q,d]); 47.线性动态规划------合唱队形 两次F =...树形动态规划(双次记录)----NOI2003 逃学小孩 朴素的话枚举节点i和离其最远两个节点 j,k O(n^2) 每个节点记录最大两个值,并记录这最大值分别是从哪个相邻节点传过来。...即使不会出现重复路径,那么它由(j,k)通过方式2同样可以得到,所以不会遗漏解时间复杂度O(n3) 93.动态规划-----ZOJ cheese f[i,j] = f[i-kk*zl[u,1],j-kk

1.1K20

动态规划解决整数划分问题

我解决这道题是从网上看方法,用递归,但是悲剧是测试用例运行超时,结果题没做出来,我直觉上觉得用动态划分可以解决,所以就研究了动态划分解法。...当n>m时,q(n , m)= q(n ,m-1)+q(n-m,m)i 然后找出初始条件,初始条件就是当n==0,时,所有划分都等于0,所以再二维数组第一行都为0,二维数组,行代表你钱数,列数代表划分数...,这些划分值在一个一维数组中存着,所以二维数组列代表,上面一维数组索引。...还有就是当1划分时候,所有值都等于1(二维数组值就是拆分个数)。...然后就按照上面的递推公式来填充二维数组,最后返回你钱数最大划分就是最终结果,我是根据01背包问题研究这道题,如有不懂请参见经典01背包问题,如写不好,请大家多批评,下面是我代码:直接可以运行出结果

35410

《算法图解》note 9 动态规划1.动态规划定义2.与分治法及贪婪算法区别3.动态规划后续学习

这是《算法图解》第九篇读书笔记,主要内容是动态规划简介。...1.动态规划定义 动态规划指的是在约束条件下,将问题划分为若干子问题并对其求出最优解,同时将子问题答案存储起来,以减少重复计算相同子问题次数,最终求出问题最优解算法思想。...2.与分治法及贪婪算法区别 贪婪算法是自上而下地逐步求解局部最优解,不依赖于子问题。 分治法实施前提是子问题相互独立,相互独立子问题避免分治法重复计算相同子问题。...而分治法则能解决子问题不独立、局部最优解求解依赖于子问题问题。 3.动态规划后续学习 由于动态规划涉及内容广,仅凭《算法图解》内容无法全面了解动态规划内容。因此,本篇读书笔记仅作引入之用。

69650

有关动态规划问题DP详细讲解

首先我们要注意,我们学习DP主要是学一种解决问题思想,而不是一种算法。 动态规划思想 动态规划是求解多阶段决策过程最优化方法。...通过把多阶段过程转化为一系列单阶段问题,利用各阶段之间关系,逐个求解。 找到各阶段之间关系是难点。...如果用思想,应该怎么做?? 首先我们想到一定是贪心策略,每次只能向右或者向下两种选择,那么 是不是只要每次都选择 右面和下面 中,其元素最大那个方向,最后答案就是最大呢? ?...for(int j=i;i<=n;j++) { sum+=a[j]; ans = max(anx,sum); } } 这已经是可以用动态规划思想去考虑最简单问题了...动态规划大显身手。我们开一个数组dp[] , 记录dp[i]表示以a[i]结尾 全部子段中 最大那个 和。 这样我们就可以根据它dp[i] 正负,去考虑是否把下一个元素加入到当前子段。

83510
领券