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. Linux内核同步机制之原子操作

    1.前言 原子操作指的是该操作不会在执行完毕之前被任何其它任务或事件打断,它是最小的执行单位,不会有比它更小的执行单位,原子实际上使用了物理学中物质微粒的概念,在Linux内核中,原子操作需要硬件的支 ...

  2. Scratch 3.6环境搭建(万江波实战记录)

    1.Scratch官网在线环境 官方网址:scratch.mit.edu 进入后,点击“Create”建立 2. Scratch官网在线环境_简体中文(点击这个地球) 3-选择:创意 4-进入”创意“ ...

  3. Win10 CompatTelRunner.exe占用磁盘高的解决办法

    (1)在运行里输入  taskschd.msc, 打开windows计划任务 (2)参考下图在Application Experience下,1,2,3,4步骤,把所有带有 “CompatTelRun ...

  4. ionic4 页面跳转传值和新页面取值

    页面跳转 : <ion-row *ngFor="let item of aboutData.stockData" [routerLink]="[ '/stock-d ...

  5. winform按钮美化(非图片)

    在开发过程中,突然发现vs自带的按钮属性中通过修改Button控件的BackColor的颜色和字体颜色(ForeColor属性)及大小,如下图 就能达到简单美化按钮的效果,下面是显示效果 有兴趣的同学 ...

  6. Delphi - 采用第三方控件TMS、SPComm开发串口调试助手

    第三方控件TMS.SPComm的下载与安装 盒子上可搜索关键字进行下载,TMS是.dpk文件,SPComm.pas文件: 安装方法自行百度,不做赘述. 通过TMS控件进行界面布局 界面预览: Delp ...

  7. 25. Apache Shiro Java反序列化漏洞

    前言: 最近在审核漏洞的时候,发现尽管Apache shiro这个反序列化漏洞爆出来好久了,但是由于漏洞特征不明显,并且shiro这个组件之前很少听说,导致大厂很多服务还存在shiro反序列化的漏洞, ...

  8. gdb gdbtui

    1. gdbtui 打开tui模式 gdbtui a.out gdb -tui a.out 调试一个正在运行的进程 gdb -p pid 在linux自带的终端里是正常显示的,但是在securecrt ...

  9. JavaWeb 过滤敏感词汇

    提交的表单数据,常常要检查有没有敏感词汇,如果有,需要给出提示,或者替换为*. 检查.替换敏感词汇有3种常用的方式 (1)在Servlet中操作. (2)在Filter中先检查.如果要替换敏感词汇,r ...

  10. group by 两个字段

    group by 的简单说明:  group by 一般和聚合函数一起使用才有意义,比如 count sum avg等 使用group by的两个要素:   (1) 出现在select后面的字段 要么 ...