[题解+总结]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文档中心,这 ...
随机推荐
- Dubbo超时和重连机制
dubbo启动时默认有重试机制和超时机制.超时机制的规则是如果在一定的时间内,provider没有返回,则认为本次调用失败,重试机制在出现调用失败时,会再次调用.如果在配置的调用次数内都失败,则认为此 ...
- Delphi编程建议遵守的规范2---命名规范
1.1.形参命名建议 所有形参的名称都应当表达出它的用途.如果合适的话,形参的名称最好以字母a 为前缀,例如: procedure SomeProc(aUserName:string; aUserAg ...
- Windows 8使用这半年(企业版)
2014-06-23 硬件:thinkpad e430c core i5-3210m 4g/500g 1.Windows 8出现开机引导问题 主要开机的时候提示缺少引导文件,按ctrl+alt+del ...
- PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
这篇文章主要介绍了PHP面向对象编程之深入理解方法重载与方法覆盖(多态)的相关资料,需要的朋友可以参考下: 什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态" ...
- 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题
一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...
- QQ的账号登录及api操作
.qq.php <?php /** * PHP Library for qq.com * * @author */ class qqPHP { function __construct($app ...
- 动软MySQL存储过程模板
<#@ template language="c#" HostSpecific="True" #><#@ output extension= ...
- [Tools] Eclipse更改类注释自动生成模板
[背景] 使用之中发现一些eclipse使用的小技巧,记录下来供以后查阅 由于机器是老婆的,创建新类的时候或者生成注释的时候全都是她的名字,避免弄混,需要设置一下: 设置创建新类时自动生成类或方法 ...
- ios程序后台运行设置(不是太懂)
文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文 ...
- Linux下autoconf和automake使用
转载:www.cnblogs.com/itech/archive/2010/11/28/1890220.html