[题解+总结]NOIP动态规划大合集
1、前言
NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解。
2、NOIP2003 加分二叉树
树形DP入门题,根据题意,一个树的加分=左子树*右子树+根节点,由此可以设f[i][j]为子树i到j的加分,则有方程:f[i][j]=max{d[t]+f[i,t-1]*f[t+1,j]} ( t∈[i,j] )
3、NOIP2004 合唱队形
应该是最简单的一道了,枚举队形的最高点,分别向左向右求最长下降子序列,然后取最大值即可。方程略。
4、NOIP2005 过河
相信这道题应该考场上没几个人能够做出来啊。。。做出来了也很难证明。。。实在是令人感到意外。题目本身难度似乎并不高,但是我们注意到数据范围<=10^9,这是连O(n)都难以接受的长度。此时可以考虑到将路径进行一些修改以满足我们的范围要求。首先求出1-10里面任意两个数的最小公倍数,然后取最大值max,可以证明当两石块之间的距离大于max的时候,那么大于它的部分的每一个点都可以通过这两个数的某一种组合跳到,所以当两个石块间的距离大于这个最小公倍数,那么就把它们的距离缩小到这个最小公倍数。我仍然不清楚这种说法是否正确,因为网上还有的说可以>=72均压缩,而取最大的最小公倍数只能是>=100压缩。正确性有待考证。用f[i]表示跳到i时最少踩到的石子数。方程:f[i]=min{f[i-k]+x} (k∈[s,t],x={0,1},用以表示i是否有石子)
5、NOIP2006 能量项链
石子合并加强版,由于是一个环,所以我们要考虑将其事先切割一次。有O(n^4)的做法——枚举切割点,在枚举左端点和右端点的基础上枚举中间点。由于n<=100,10^8的范围勉强能过。对于切割点的枚举,能不能考虑优化呢?我们不需要在实际上切割,设置数组时可以将数据复制一次,然后直接进入合并过程。用f[i][j]表示从第i个数到第j个数全部合并的最大得分,则ans=max{f[k][n+k+1]} (k∈[1,n-1]),f[k][n+k+1]表示切割点在k-1到k之间。方程:f[i][j]=max{f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1]} (k∈[i,j-1])
6、NOIP2006 金明的预算方案
背包问题加强版,我没有想到这种做法,太弱了。。。同样地,f[i][j]表示前i个物品用了不超过j元所得到的重要度乘价格的最大值,由于主件存在附件,购买附件的前提是主件要购买,在动态规划中我们不可能进行类似于搜索中的条件判断,这一考虑将这一要求进行压缩——枚举物品时,若该物品为附件,直接跳过;若该物品为主件,则进行三次转移——单独买主件;买主件和一个附件;买主件和两个附件。这样,存在方程:f[i][j]=f[i-1][j-w[i]]+p[i]*v[i]。
7、NOIP2007 矩阵取数
n行m列,由于行与行之间没有任何联系,所以我们对于每一行进行动态规划,然后计算总和即可。f[i][j]表示当前行剩余第i个数到第j个数没有被取走时的最大得分,存在取走左边和取走右边两种情况,故f[i][j]=max{f[i][j-1]+a[j]*2^(m-j+i),f[i+1][j]+a[i]*2^(m-i+j)}。由于数据很大,需要用到高精度加法。
8、NOIP2008 传纸条
待补充。
9、NOIP2010 乌龟棋
待补充。
10、NOIP2013 花匠
这道题的正解貌似是贪心?找到拐点就行了。。。但是动态规划同样可行。首先容易想到的是一种O(n^2)的算法。因为题目要求数列保持波浪形,存在两种情况,一高一矮或一矮一高(奇偶性讨论),f[i][0]表示以第i朵花为终点,且其为高花时的最多剩余花数;f[i][1]表示以第i朵花为终点,且其为矮花时的最多剩余花数。故根据波浪形态进行交替转移,可得方程:f[i][0]=max{f[j][1]}+1(j∈[1,i-1],h[i]>h[j]); f[i][1]=max{f[j][0]}+1(j∈[1,i-1],h[i]<h[j])。
但是,n<=100000,O(n^2)显然过不了。我们能否省去一个维度?看了题解之后豁然开朗,我们在转移的时候根本不需要用到之前的所有状态,只需要考虑前面一朵花与当前花的关系。为什么?根据题意,在判断第i朵花时,在[1,i-1]中符合转移条件中最大值必定在最后,符合局部单调性。故我们只需要关注第i-1朵花的状态。f[i][0]和f[i][1]的含义同上,根据h[i]>h[i-1],hh[i]<h[i-1],要么选,要么不选;对于h[i]=h[i-1],必定不选,O(n)就行了,方程:f[i][0]=max(f[i-1][1]+1,f[i-1][0]),f[i][1]=f[i-1][1](h[i]>h[i-1]);f[i][0]=f[i-1][0],f[i][[1]=f[i-1][1](h[i]=h[i-1]);f[i][0]=f[i-1][0],f[i][1]=max(f[i-1][0]+1,f[i-1][1])(h[i]<h[i-1])。
11、NOIP2014 飞翔的小鸟
当时什么都没有想就直接打了个50分的暴力,其实现在看来还是比较容易看出这是一道动态规划。同样裸DP只有70分,需要单调队列优化。待补充。
12、小结
现在对动态规划的题目做一个总结。NOIP的难度大概就是上面所述了,我也在慢慢脑补着动规的大洞,动态规划许多题目做题的方式存在共同点:首先我们要根据题目的修改操作来设计状态,要求状态一定是没有重叠单独存在的(就是说对于动态规划数组中的每一个元素都只对应着一个状态),同时我们能够通过线性转移来得到答案。
有些状态很明显,很容易设计,比如“合唱队形”,“乌龟棋”,“能量项链“感觉能够目测大概的模型;但是有些题目模模糊糊,一定要找到最合适的状态。比如“矩阵取数”,原本我设的是f[i][j]为当前共取走i个,其中从左边取走j个时的最大分数。这符合状态的独立性,但是不方便转移(也有可能是我当时没有想到)。
然而在一切都大功告成之后,一定要验证一下复杂度是否正确。虽然大多数题目是提供部分分的,但是如果动态规划能够做到AC的话,当然是要去考虑优化的,如“花匠”。类似于最长上升子序列就存在O(n^2)和O(n log n)两种做法。优化的话,可以直接用朴素的方式;同样斜率优化,单调队列也是必要的。
[题解+总结]NOIP动态规划大合集的更多相关文章
- NOIP动态规划大合集
1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...
- [题解+总结]动态规划大合集II
1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2. ...
- 动态规划大合集II
1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2. ...
- Lucene搜索方式大合集
package junit; import java.io.File; import java.io.IOException; import java.text.ParseException; imp ...
- 【收藏】Java多线程/并发编程大合集
(一).[Java并发编程]并发编程大合集-兰亭风雨 [Java并发编程]实现多线程的两种方法 [Java并发编程]线程的中断 [Java并发编程]正确挂起.恢复.终止线程 [ ...
- 从零开始学数据分析,什么程度可以找到工作?( 内附20G、5000分钟数据分析工具教程大合集 )
从零开始学数据分析,什么程度可以找到工作?( 内附20G.5000分钟数据分析工具教程大合集 ) 我现在在Coursera上面学data science 中的R programming,过去很少接 ...
- 直接拿来用!Facebook移动开源项目大合集
直接拿来用!Facebook移动开源项目大合集 时间:2014-04-22 15:37 作者:唐小引 随着iOS依赖管理工具CocoaPods和大量第三方开源库成熟起来,业界积累了大量的优秀开源项目. ...
- python字符串操作实方法大合集
python字符串操作实方法大合集,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等,需要的朋友可以参考下: #1.去空格及特殊符号 s.st ...
- 【Oracle教程资源大合集】Oracle数据库免费学习资源汇总
Oracle的产品非常丰富,各类学习资源也五花八门,本文将介绍Oracle官方的免费教程与风哥整理的Oracle视频教程: 1.Oracle帮助中心 Oracle帮助中心也称为Oracle文档中心,这 ...
随机推荐
- JQuery阻止冒泡事件on绑定中异常情况分析
科普下事件冒泡以及默认行为,以下面例子举列子: 事件冒泡:当点击内部button元素时,会触发自身及外层 a的点击事件,这就是事件冒泡引起的.事件会随着 DOM 的层次结构依次向上传播. 事件 ...
- 【Javascript】IE8兼容 背景图片与a标签的onclick事件
先说几句牢骚话. 虽然IE8比之IE6.7有很大的进步,但是在执行效率.兼容性上仍然有很多问题.被广大开发者喜爱的平台才是好平台. 可惜多亏当年盗版XP打开中国的计算机市场,IE作为一款捆绑软件仍然在 ...
- Nginx详解(一)
1.Nginx是什么? Nginx就是反向代理服务器. 首先我们先来看看什么是代理服务器,代理服务器一般是指局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端.比如Go ...
- 【转载】Python编写简易木马程序
转载来自: http://drops.wooyun.org/papers/4751?utm_source=tuicool 使用Python编写一个具有键盘记录.截屏以及通信功能的简易木马. 首先准备好 ...
- MVC部分视图(Partial View)
分部视图,也就是整体视图的一部分.单个视图页面展示在整体页面之上,使用步骤如下 1.创建视图数据也就是viewmodel public class FooterViewModel { public s ...
- gcc【数学几何】
GCC Time Limit: 1000MS Memory limit: 65536K 题目描述 The GNU Compiler Collection (usually shortened to G ...
- makefile示例
1. 生成.so动态库 示例一: SoVer = 10010110CfgVer = 10010110 BinName = fnights.soGameName = "\"fnigh ...
- Vmware 中安装Unix
准备 1. ubuntu 14.10 下载地址: 官网下载链接 http://www.ubuntu.com/download/desktop 官方版本库 http://releases.ubuntu. ...
- 攻城狮在路上(壹) Hibernate(七)--- 通过Hibernate操纵对象(下)
一.与触发器协同工作: 当Hibernate与数据库的触发器协同工作时,会出现以下两类问题: 1.触发器使Session缓存中的数据和数据库中的不一致: 出现此问题的原因是触发器运行在数据库内,它执行 ...
- [Qcon] 百姓网开发总结
拿到的PPT看了之后,发现给出的很简洁,但每个步骤用处却非常有用,我们一个个来分析: 1. 集中开发环境,这些方法看似简单,但是都是很实用的方法,在我开发中看的出来,SVN无分支就能解决我现有部门的部 ...