[题解+总结]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文档中心,这 ...
随机推荐
- 与你相遇好幸运,Waterline的多表关联
>一对一关联 表示一个模型可能只与另一个模型关联.为了使模型知道它与其他哪些模型关联,外键必需包含在记录中.. http://imfly.github.io/sails-docs/concept ...
- Redis不同数据类型的的数据结构实现
我们知道Redis支持五种数据类型, 分别是字符串.哈希表(map).列表(list).集合(set)和有序集合,和Java的集合框架类似,不同数据类型的数据结构实也是不一样的. >>Re ...
- 如何做好App的引导页?(转)
http://uedc.163.com/12264.html 当你第一次打开一款应用的时候常常会看到精美的引导页设计,它们在你未使用产品之前提前告知你产品的主要功能与特点,第一次印象的好坏会极大地影响 ...
- Notice: Only variable references should be returned by reference(PHP版本兼容性问题)
摘自:http://sushener.spaces.live.com/blog/cns!BB54050A5CFAFCDD!435.entry PHP5一个很让人恼火的一点就是BC(向后兼容)不是很理想 ...
- 【网络资料】如何优雅地使用Sublime Text3
如何优雅地使用Sublime Text3 Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相 ...
- POJ1285 Combinations, Once Again(背包 排列组合)
背包解组合数学问题,n种物品,每种num[i]个,求取r个的方法数. 背包思想,f[j]表示当前取j个数的方法数,则状态转移方程为 f[j] += f[k](max(j - num[i], 0) &l ...
- <转>WCF实例化模式与高并发处理
WCF实例化模式与高并发控制 1.实例化模式InstanceModel 1.1 PerCall:单调模式 每次调用都会产生一个实例 例[ServiceBehavior(InstanceContextM ...
- TensorFlow
转自:http://blog.csdn.net/stdcoutzyx/article/details/51645396 本片博文是参考文献[1]的阅读笔记,特此声明 TensorFlow,以下简称TF ...
- Codeforces Round #370 (Div. 2) D. Memory and Scores DP
D. Memory and Scores Memory and his friend Lexa are competing to get higher score in one popular c ...
- silverlight和wpf中暴露 给子类override
protected virtual void OnSelectionChanged(SelectionChangedEventArgs args) { } public TestTabControl( ...