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动态规划大合集的更多相关文章

  1. NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  2. [题解+总结]动态规划大合集II

    1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2. ...

  3. 动态规划大合集II

    1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2. ...

  4. Lucene搜索方式大合集

    package junit; import java.io.File; import java.io.IOException; import java.text.ParseException; imp ...

  5. 【收藏】Java多线程/并发编程大合集

    (一).[Java并发编程]并发编程大合集-兰亭风雨    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [ ...

  6. 从零开始学数据分析,什么程度可以找到工作?( 内附20G、5000分钟数据分析工具教程大合集 )

    从零开始学数据分析,什么程度可以找到工作?( 内附20G.5000分钟数据分析工具教程大合集 )   我现在在Coursera上面学data science 中的R programming,过去很少接 ...

  7. 直接拿来用!Facebook移动开源项目大合集

    直接拿来用!Facebook移动开源项目大合集 时间:2014-04-22 15:37 作者:唐小引 随着iOS依赖管理工具CocoaPods和大量第三方开源库成熟起来,业界积累了大量的优秀开源项目. ...

  8. python字符串操作实方法大合集

    python字符串操作实方法大合集,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等,需要的朋友可以参考下:   #1.去空格及特殊符号 s.st ...

  9. 【Oracle教程资源大合集】Oracle数据库免费学习资源汇总

    Oracle的产品非常丰富,各类学习资源也五花八门,本文将介绍Oracle官方的免费教程与风哥整理的Oracle视频教程: 1.Oracle帮助中心 Oracle帮助中心也称为Oracle文档中心,这 ...

随机推荐

  1. SQL Server创建随机测试数据

    我们在做数据仓库开发的过程中,经常需要插入大量的测试数据来测试数据库查询性能和计算占用的存储空间等.本文主要介绍下不借用第三方的工具在数据库中直接生成大量的测试数据. 需求 每一行包含5个日期字段和一 ...

  2. 第十一篇:SOUI系统资源管理

    SOUI资源管理模块 从前篇已经讲到在SOUI中所有资源文件通过一个uires.idx文件进行索引. 这里将介绍在程序中如何引用这些资源文件. 在SOUI系统中,资源文件通过一个统一的接口对象读取: ...

  3. 在Salesforce中调用外部系统所提供的的Web Service

    这里需要提供外部service所对应的WSDL文件(Salesforce只支持从本地上传),并且提供的WSDL文件有如下两点要求: 1):wsdl 文件只能有一个binding,Salesforce是 ...

  4. JS自定义属性兼容

    var obj={}; if(obj.dataset){ obj.dataset.original="11"; }else{ obj.getAttribute("data ...

  5. jsp网站环境搭建

    工具:tomcat7(exe安装版).jre7.javaxcms(安装版.非源码).mysql 1.先安装jre7,或者安装java7(自带了jre7) 2.安装tomcat7,期间要选择jre7安装 ...

  6. Popupwindow 的简单实用,(显示在控件下方)

    第一步: private PopupWindow mPopupWindow; 第二步:写一个popupwindow的布局文件XML <?xml version="1.0" e ...

  7. c#基础系列(转)

    转:http://www.cnblogs.com/landeanfen/p/4953025.html C#基础系列——一场风花雪月的邂逅:接口和抽象类 前言:最近一个认识的朋友准备转行做编程,看他自己 ...

  8. hdu3535 背包大杂汇

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3535 //不想写题解,这道题让我对背包的理解更深了,我相信我不会忘记的.... 代码: # ...

  9. node read file fs

    var fs = require("fs") fs.readFile("file.txt","UTF-8",function(err,dat ...

  10. 转 Delphi中使用FastMM4结合View CPU避免内存泄漏

    http://www.cnblogs.com/kongchao/archive/2009/10/27/1590479.html 核心提示:内存泄漏经常出现在本地代码中,特别是多线程和发生异常的情况下, ...