动态规划做多了以后,总结的相关知识

动态规划 Dynamic Programming DP

 

准则

动态规划的本质,是对问题状态的定义和状态转移方程的定义。

动态规划是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。

如何拆分问题,才是动态规划的核心。

而拆分问题,靠的就是状态的定义和状态转移方程的定义。

 

以LIS为例,重新定义这个问题:

给定一个数列,长度为N,

设F_{k}为:以数列中第k项结尾的最长上升子序列的长度.

求F_{1}..F_{N} 中的最大值.

对于F_{k}来讲,F_{1} .. F_{k-1}都是F_{k}的子问题:因为以第k项结尾的最长递增子序列(下称LIS),包含着以第1..k-1中某项结尾的LIS。

 

上述的新问题F_{k}也可以叫做状态,定义中的“F_{k}为数列中第k项结尾的LIS的长度”,就叫做对状态的定义。

之所以把F_{k}做“状态”而不是“问题” ,一是因为避免跟原问题中“问题”混淆,二是因为这个新问题是数学化定义的。

 

上述状态定义好之后,状态和状态之间的关系式,就叫做状态转移方程。

比如,对于LIS问题,状态转移方程为:

以第k项结尾的LIS的长度是:保证第i项比第k项小的情况下,以第i项结尾的LIS长度加一的最大值,取遍i的所有值(i小于k)。

 

a. “缓存”,“重叠子问题”,“记忆化”

这三个名词,都是在阐述递推式求解的技巧。以Fibonacci数列为例,计算第100项的时候,需要计算第99项和98项;在计算第101项的时候,需要第100项和第99项,这时候你还需要重新计算第99项吗?不需要,你只需要在第一次计算的时候把它记下来就可以了。上述的需要再次计算的“第99项”,就叫“重叠子问题”。如果没有计算过,就按照递推式计算,如果计算过,直接使用,就像“缓存”一样,这种方法,叫做“记忆化”,这是递推式求解的技巧。这种技巧,通俗的说叫“花费空间来节省时间”。都不是动态规划的本质,不是动态规划的核心。

b. “自上而下”,“自下而上”

“递归”:递归是递推式求解的方法,连技巧都算不上。

怎么实现dp?答:两种常用的方法。(仅仅涉及一般问题)     

 1. 自下而上:通过正向的loop,求出所有状态对应的值,然后找出max或者min。             优缺点:速度慢,但是相对节省空间。     

2. 自上而下:通过递归的方法,需要求解f(x),则必须知道f(y),要知道f(y),必须求f(z).            优缺点:速度快,只用算需要的值,但是要调用堆栈,浪费空间。

 

c. "无后效性",“最优子结构”

上述的状态转移方程中,等式右边不会用到下标大于左边i或者k的值,这是"无后效性"的通俗上的数学定义,符合这种定义的状态定义,我们可以说它具有“最优子结构”的性质,在动态规划中我们要做的,就是找到这种“最优子结构”。

每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到

这个性质叫做最优子结构;

而不管之前这个状态是如何得到的

这个性质叫做无后效性。

在对状态和状态转移方程的定义过程中,满足“最优子结构”是一个隐含的条件(否则根本定义不出来)。

d. 关于复杂度的分析

时间复杂度O (状态数 * 每个状态下所对应的决策数)。

空间复杂度O (状态数)。

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

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

相关文章

(十三) 深入浅出TCPIP之TCP套接字参数

专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三)深入浅出TCPIP之再识TCP,理解…

(七)深入浅出TCPIP之深入浅出TCPIP之TCP重传机制

目录 TCP重传机制 超时重传机制 快速重传机制 专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上&#x

那些年,我们信了课本里的那些鬼话

教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分…

(十一)深入浅出TCPIP之TCP粘包问题

目录 粘包和拆包问题 保护消息边界和流 粘包、拆包场景 为什么会发生TCP粘包、拆包呢?

Linux必懂知识大总结(上)

CPU top top:查看每个进程的情况 在top模式下,输入1:查看每个CPU的性能数据,注意观察是否有CPU100%占用率 CPU参数含义: 1)us过高表示Java应用程序消耗了大量CPU,需要定位是哪一个线程&#x…

(十六)深入浅出TCPIP之Hello CDN

专栏其他文章 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上) (四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析 (五)深入浅出TCPIP之TCP流…

(十五)非常全面的TCPIP面试宝典-进入大厂必备总结

专栏其他文章 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上) (四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析 (五)深入浅出TCPIP之TCP流量…

Linux必懂知识大总结(下)

AWK/SED awk awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行…

深入浅出TCPIP之实战篇—用c++开发一个http服务器(二十一)

专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上) (四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析 (五)深入浅出TCPIP之TCP流…

ncnn网络框架使用指南

下面以在ncnn上实现caffe网络模型为例,和大家分享下ncnn这个牛叉的网络框架的使用指南。 准备caffe网络和模型 caffe 的网络和模型通常是搞深度学习的研究者训练出来的,一般来说训练完会有 train.prototxt deploy.prototxt snapshot_10000.caffemodel 部署的时候只需要 T…

Linux必懂知识大总结(补)

关机 1. 数据同步写入磁盘 sync 为了加快对磁盘上文件的读写速度,位于内存中的文件数据不会立即同步到磁盘上,因此关机之前需要先进行 sync 同步操作。 2. shutdown # /sbin/shutdown [-krhc] [时间] [警告讯息] -k : 不会关机&#xff…

(十八)深入浅出TCPIP之HTTP和HTTPS

专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上) (四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析 (五)深入浅出TCPIP之TCP流…

leetcode118. 杨辉三角

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。 在杨辉三角中,每个数是它左上方和右上方的数的和。 示例: 输入: 5 输出: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 思路:没什么可说的,依次…

抖音快手小视频推荐算法之--协同过滤算法剖析

有人说抖音摧毁了中国的年轻人,也有人说抖音改变了自己的生活形态,还有人说抖音让自己的生活过的更加有意义……一千个人眼中,有一千个哈姆雷特,各人有各个行使自己话语的权力,我们无从争辩。 对于做自媒体的同仁们来说抖音就是粉丝变现的另外一个渠道,那抖音具体的算法…

如何抓住QQ小游戏买量红利:休闲与内购小游戏买量优化方法分享

2019年5月,Qzone小游戏、玩一玩整合升级为全新QQ小游戏平台,其以开放的社交生态和关系链,为开发者带来了巨大的流量红利。 为了帮助更多开发者适应和了解新市场。本文将介绍QQ小游戏投放规模现状以及各项扶持政策,并解读轻度小游…

(一)容器从入门到深入-容器和镜像

一、容器与镜像 什么是容器? 在介绍容器的具体概念之前,先简单回顾一下操作系统是如何管理进程的。 首先,当我们登录到操作系统之后,可以通过 ps 等操作看到各式各样的进程,这些进程包括系统自带的服务和用户的应用…

leetcode461. 汉明距离

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y&#xff0c;计算它们之间的汉明距离。 注意&#xff1a; 0 ≤ x, y < 231. 示例: 输入: x 1, y 4 输出: 2 解释: 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 上面的箭…

(二)容器从入门到深入-初识Kubernetes

Kubernetes 是什么 Kubernetes 脱胎于 Google 的 Borg 系统&#xff0c;是一个功能强大的容器编排系统。Kubernetes 及其整个生态系统&#xff08;工具、模块、插件等&#xff09;均使用 Go 语言编写&#xff0c;从而构成一套面向 API、可高速运行的程序集合&#xff0c;这些程…

记一次海外大型SLG游戏服务器进程被OOM的修复经历

事情经过 最近刚接手一个多次获得海外GooglePlay推荐的SLG的游戏项目,服务器是java的netty框架写的,客户端是cocos lua。 好吧既然服务器进程运行在jvm之上,吃内存倒是挺厉害的,我一个16G内存的服务器被吃的满满的,这个时候为了解决内存不足,我开启了4G的虚拟内存,方法…

leetcode50. Pow(x, n)

实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数。 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 1/22 1/4 0.25 说明: -100.0 < x < 100.0 n 是 32 位有符号整数…