动态规划的理解与案例分析
动态规划的本质
常用的五大算法,包含 动态规划、分治法、贪心求解法、回朔法、分支限界法。
动态规划(Dynamic Programming),与其说是一种算法,不如说是一种解决问题的思路。 :peach:
Dynamic Programming is a methed for solving a complex problem by breaking it down into a collection of simpler subproblems.
上述引自维基百科,也就是说动态规划就是将一个复杂的问题分解成若干简单的问题集的一种方法。
那么怎么分解问题就成了动态规划的本质。
而分解问题,依靠的就是 问题的状态 和 状态之间的转移。
- 如何定义一个状态
我们需要找到一个问题在某一个状态的 最优解。 :strawberry:
举个例子:
最长递增子序列(LIS) 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱) 例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8} 则其最长的单调递增子序列为{5,6,7,8},长度为4
由此我们定义一个状态,当以第i个数组元素结尾的最长递增子序列dp(i)。 整个数组的LIS就是dp(1)...dp(n)的最大值。
由此我们就定义好了一个问题的状态,下面我们就看看不同状态之间的转移。
- 如何找到状态的转移
首先,我们需要找到状态的 边界值。 :watermelon:
根据上述LIS的问题,边界值为当i=1时,最长递增子序列为1。
然后,我们需要找到状态之间的 关系。 :banana:
dp(i) = max(1,dp(j)+1...) (0<=j<i) 当array[j]<array[i]
解释一下,在保证第i项比第j项大的情况下,要取之前所有项的最长递增子序列加1的最大值。
这里可以看出,这里的状态转移方程,就是定义了问题和子问题之间的关系。 可以看出,状态转移方程就是带有条件的递推式。
动态规划经典练习
这里罗列了6道比较经典的动态规划练习。 :corn:
/*** No1.塔树选择和最大问题** 一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。* 每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。* 5* 8 4* 3 6 9* 7 2 9 5* 例子中的最优方案是:5 + 8 + 6 + 9 = 28** 输入:符合塔树的二维数组。* 输出:经过的最大值。*//*** No2.∑乘法表问题** ∑ | a b c* ——————————————* a | b b a* b | c b a* c | a c c** 依此乘法表,对任一定义于∑上的字符串,适当加括号表达式后得到一个表达式。* 例如,对于字符串x=bbbba,它的其中一个加括号表达式为i(b(bb))(ba)。* 依乘法表,该表达式的值为a。试设计一个动态规划算法,对任一定义于∑上的字符串x=x1x2…xn。* 计算有多少种不同的加括号方式,使由x导出的加括号表达式的值为a。** 输入:输入一个以a,b,c组成的任意一个字符串。* 输出:计算出的加括号方式数。*//*** No.3跳台阶** 一只青蛙一次可以跳上1级台阶,也可以跳上2级。* 求该青蛙跳上一个n级的台阶总共有多少种跳法。** 输入:台阶数n。* 输出:跳法总数。*//*** No.4最长递增子序列(LIS)** 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。* 例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8}。* 则其最长的单调递增子序列为{5,6,7,8},长度为4。** 输入:一个数组。* 输出:最长递增子序列的长度。*//*** No.5背包问题** 有N件物品和一个容量为V的背包。* 第i件物品的大小是c[i],价值是w[i]。* 求解将哪些物品装入背包可使价值总和最大。** 输入:物品大小数组c,物品价值数组w,背包容量。* 输出:最大的价值。*//*** No.6最长公共子序列(LCS)** 给出两个字符串a, b,求它们的最长的公共子序列。** 输入:字符串a和字符串b。* 输出:最长的公共子序列的长度。*/
复制代码
请先根据动态规划的本质,定义出 状态 和 状态之间的关系,然后再进行代码编写。
如果你已经完成了练习,这里有上述问题的答案,戳这里。
分享一个对于动态规划比较不错的理解。
动态规划的理解与案例分析相关推荐
- RFM模型的理解和python案例分析
RFM模型是什么 RFM是客户关系管理(CRM:Customer Relationship Management)中一种重要的分析模型,通过研究一个客户的交易时间.交易频率和交易总金额来衡量客户的价值 ...
- 《深入理解JVM.2nd》笔记(五):调优案例分析与实战
文章目录 概念 案例分析 高性能硬件上的程序部署策略 情景再现1 问题分析1 关于Full GC 使用64位JDK来管理大内存可能遇到问题 建立逻辑集群 使用逻辑集群可能遇到的问题 最后解决方案 集群 ...
- 案例分析 | SAP如何帮助企业实现端到端的数字化供应链管理
https://www.toutiao.com/a6687387597922107916/ 在我之前的一篇 <收藏 | 供应链管理最佳实践之S&OP> 文章中,为大家介绍了关于S& ...
- 河北省重大系统征集系统案例分析
网站的可用性描述网站可有效访问的特性,相比于网络的其他非功能的特性,网站的可用性更能牵动人们的神经.因为,大型网站如果发生不可用的事故,将直接的影响公司的形象及利益,所以,网站的可用性及其重要.正如& ...
- linux 定位 踩内存_运维必备的问题定位工具及案例分析
[摘要]本文主要介绍各种问题定位的工具,并结合案例分析问题. 1. 背景 有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源.这时候就需要登录服务器进一步深入分析问题的根源.那么分析问 ...
- EMD算法之Hilbert-Huang Transform原理详解和案例分析
目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...
- 华为企业管理经典案例_企业税务筹划-华为公司税筹案例分析
中国企业集团跨国经营注定其要面临激烈的国际竞争,在生产经营过程中,税务管理方面需要严格依据各个国家的税法进行税务筹划和管理,同时还需要对各类应税经营活动进行科学合理的安排,以最大程度上降低企业税负!对 ...
- c语言程序大型案例分析,C语言程序设计习题解析与应用案例分析(第2版)
摘要: <C语言程序设计习题解析与应用案例分析(第2版)>从C语言程序设计的基本原理及程序设计的基本思想出发,贯穿"基础-应用"这一主线.<C语言程序设计习题解析 ...
- 第 28 小时项目管理过程实践和案例分析
第 28 小时项目管理过程实践和案例分析 根据考试大纲,这部分作为下午 考试的内容,共有 3 道大题,每题 25 分,共 75 分,45 分及格.考题形式为"计算+项目管理有关知识" ...
最新文章
- 解决“cannot open git-receive-pack”错误
- SAP C/4HANA到底包含哪些产品?
- 知识点总结(基础篇)
- [转]UIWebView 监控 XMLHttpRequest
- HDU2022 海选女主角【最值】
- linux下复制catalog信息指令,基於Linux下catalog方式的 Oracle 備份策略(RMAN)
- 2014中国高校SAS数据分析大赛拉开帷幕
- JQuery函数的作用
- 我的世界java放大化是什么_我的世界:你玩过神奇的放大化种子吗?官方:这些东西非常吃资源...
- 刘润《五分钟商学院》思维导图笔记 - 商业篇
- 什么是serialVersionUID?serialVersionUID详解
- 5ecsgo启动失败2错误代码2,5E打开csgo说csgo客户端需要更新 然后进不去游戏怎么回事?...
- a标签去掉下划线_怎么去掉html a超链接下划线
- 【读书笔记】两个天才 发挥孩子的创造力 4岁以上 蒲蒲兰绘本
- redis数据库的概述
- 操作系统之文件系统:4、文件存储空间管理(空闲表法、空闲链表法、位示图法、成组链接法)
- 前端(以Vue为例)webpack打包后dist文件包如何部署到django后台中
- 无线测量APP开发总结
- bazaar android app,Bazaart
- MATLAB运用——多项式插值
热门文章
- python 如何修改字典的key值_Python编程:如何把元组/字典作为参数传递给函数(附代码)...
- XnSay临时网盘程序v1.0全开源
- 全新精美UI口红机闯三关赢礼品源码
- 小清新自适应宇航员404页面丢失svg错误网页源码
- 综合短网址缩短和还原源码
- 生肖派对怎么放机器人_抖音生肖派对游戏
- 苹果cmsv10自适应卡通动漫番剧模板
- Redis主从复制配置(原理剖析)
- 虚拟空间,域名解析,A记录,MX记录,CNAME记录,TTL 等 更多Web服务器相关名词解释
- PHP无限极分类生成树方法,无限分级