【专章】dp入门
知识点
动态规划(简称dp),可以说是各种程序设计中遇到的第一个坎吧,这篇博文是我对dp的一点点理解,希望可以帮助更多人dp入门。
先看看这段话
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著《Dynamic Programming》,这是该领域的第一本著作。
这是百度百科上对于动态规划介绍,其实dp并没有这么复杂,可以把dp看作是记忆化搜索的递推形式。
再来看一下下面这段文字(来自《挑战程序设计竞赛(第二版)》):
就像上面所说的,对于一道题目,如果选择搜索可能会出现大量重复的状态,如函数f
int f(int a,int b)
{
return f(a+,b+)+f(a-,b-);
}
这种函数在计算过程中有大量的资源被浪费,如 f(1,1) 和 f(3,3) 在返回值时都会计算一次 f(2,2),这种无谓的计算致使了动态规划的诞生。
动态规划算法通常基于一个递推公式及一个或多个初始状态。当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度,因此它比回溯法、暴力法等要快许多。
现在让我们通过一个例子来了解一下DP的基本原理。
首先,我们要找到某个状态的最优解,然后在它的帮助下,找到下一个状态的最优解。
(上面这段话看不懂也就别看了)
其实简单的来说,dp就是用数组来递推下一个状态。
像上面的f函数,写成dp就是 f[a][b] 。递推式也与函数基本相同:f[a][b]=f[a-1][b-1]+f[a+1][b+1]。用这个式子,双重循环即可。
例题
如下是几个经典问题,对于初学者来说有一点点难度,不懂可以多看几篇关于dp入门的文章。此处附上我的代码。题目可以百度。
最好要理解,并能独立实现代码
1、01背包
2、最长上升子序列(简称LIS,两种做法,一种是O(n2),另一种是O(nlogn))
3、最长公共子序列(简称LCS)
看完了上面的,可以做做题练练手了。
下面是一些题目的练习,题目都在www.luogu.org上,可以配合里面的题解与我的代码来理解。
习题
下述题目都为基础的dp包括经典问题与其各种变形,乃dp入门必备之题。
注意: 1、从最下面往上刷
最后提供一些练习题与详解:传送门
刷完了进入下一章:dp基础
洛谷P1280 尼克的任务
逆序dp,详见注释
洛谷P1091 合唱队形
从头开始,从尾开始各跑一次LIS
洛谷P1115 最大子段和 dp
洛谷P1508 Likecloud-吃、吃、吃
洛谷P1510 精卫填海
洛谷P1855 榨取kkksc03
洛谷P1216 [USACO1.5]数字三角形 Number Triangles
洛谷P1910 L国的战斗之间谍
洛谷P2925 [USACO08DEC]干草出售Hay For Sale
洛谷P2347 砝码称重
洛谷P2722 总分 Score Inflation
开始dp入门的征程吧!
------------------------------------------------------------------------------------------
后继章:dp基础。
【专章】dp入门的更多相关文章
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- xbz分组题B 吉利数字 数位dp入门
B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...
- 【dp入门题】【跟着14练dp吧...囧】
A HDU_2048 数塔 dp入门题——数塔问题:求路径的最大和: 状态方程: dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j];dp[n][j] = ...
- 数位dp入门 hdu2089 不要62
数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
- hdu3555 Bomb 数位DP入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...
- HDU 2084 数塔(简单DP入门)
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- 树形dp 入门
今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...
- 树形DP入门详解+题目推荐
树形DP.这是个什么东西?为什么叫这个名字?跟其他DP有什么区别? 相信很多初学者在刚刚接触一种新思想的时候都会有这种问题. 没错,树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上. 既 ...
随机推荐
- httpd2.4常用配置
author:JevonWei 版权声明:原创作品 httpd 2.4配置 切换使用的MPM Centos7:/etc/httpd/conf.modules.d/00-mpm.conf 启用要启用的M ...
- 车牌识别OCR—易泊时代智慧城市解决方案模块
牌识别(License Plate Recognition,LPR) 是视频图像识别技术在智能交通领域中的一个模块.车牌识别运用OCR技术,将视频流或图片中的汽车牌照从复杂的应用场景中提取并识别出来, ...
- error: The requested URL returned error: 401 Unauthorized while accessing
我遇到的其中一个问题. 问题描述: 在git push -u origin master是,提示“error: The requested URL returned error: 401 Unauth ...
- 201521123026《Java程序设计》第2周学习总结
1. 本章学习收获 1.熟悉了码云的部分功能的使用 2.java编程基础的巩固以及延伸 3.解决了部分PTA编程时所遇到困难并明白了解决困难的方法的原理 4.了解了用package和import管理类 ...
- Linux系统常用的文件查看及处理命令
常用的文本查看及处理命令 1.cat命令 (1).作用 连接文件并打印到标准输出设备上,cat经常用来显示文件的内容. (2).用法 1):用法:cat (参数) 文件 2):常用参数 -n或-nu ...
- Java并发编程 Volatile关键字解析
volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...
- 06jQuery-03-选择器查找和过滤
1.查找 find().parent().prev().next() 通常情况下选择器可以直接定位到我们想要的元素,但是,当我们拿到一个jQuery对象后,还可以以这个对象为基准,进行查找和过滤. 最 ...
- 利用Struts拦截器限制上传图片的格式和大小
在这之前 Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小.那么既然是使用Struts已经写好的拦 ...
- python实例编写(2)--等待,一组对象,层级元素,frame对象处理
一.设置等待 #coding=utf-8 from selenium import webdriver from selenium.webdriver.support.ui import WebDri ...
- java 如何判断操作系统是Linux还是Windows
String os = System.getProperty("os.name"); if(os.toLowerCase().startsWith("win") ...