easyui动态增加datagrid列_动态规划NOIP提高组历年高频考点(1)

本文深入探讨了动态规划的概念,包括动态规划的定义、基本思想、步骤和常见类型。通过实例解析动态规划的递推、记忆化搜索、状态转移方程以及最优化原理。还介绍了动态规划在信息学竞赛中的应用,如线性、区域和树形动态规划问题,以及背包问题。此外,文章提到了动态规划的优化技巧,如状态压缩。
摘要由CSDN通过智能技术生成
点击上面微信号关注我eee42f8ad36210e1de24053c354a4bb6.png关注我哟 定期推送帐号信息学新闻,竞赛自主招生,信息学专业知识,信息学疑难解答,信息学训练营信息等诸多优质内容的微信平台,欢迎分享文章给你的朋友或者朋友圈!有任何问题请联系小编! NOIP2020考前刷题冲刺营课程0236ebb555f2488e52377be6fbad1f21.gif

    通过分析NOIP2011-2018年提高组的试题我们就会发现,考察最多的考点前三名就是模拟,动态规划和贪心算法。简单统计这八年的提高组48个试题我们发现,模拟和动态规划各考察了有11次之多,模拟我们不过多提及,今天我们说说常见且考察最多的动态规划算法。

1.      概论:        动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。动态规划不是一种具体的算法,而是对解最优化问题的一种途径、一种方法。常见的动态规划有线性动态规划、区域动态规划、树型动态规划、背包问题等。        2.      知识点梳理: 2.1 基本模型     动态规划是解决一个多阶段决策过程的最优化问题的常用算法。所谓多阶段决策过程,指的是这样一类特殊过程,过程可以按照一定的顺序分解成若干个相互联系的阶段,在每一个阶段都需要作出决策。全部过程的决策是一个决策序列。而动态规划,就是解决这类过程的最优化问题。利用动态规划解决的多阶段决策过程,必须要有最优子结构特点。即对于一个最优的决策序列,其子序列也是最优的。 2.2  基本思想     动态规划算法的基本思想是:将带求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解中得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,避免重复求解。该思想与记忆化搜索类似,即将计算步骤中的过程保存下来,避免重复运算。 2.3  基本步骤     动态规划算法求解的基本步骤如下:

(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

(2)确定状态和状态变量:注意状态必须满足无后效性。

(3)确定决策:找到子问题是进行动态规划的重要一步。动态规划和递推更多应考虑本问题由哪些已解决子问题构成,而不是考虑本问题对将来哪些问题有贡献。

(4)确定边界条件,写出状态转移方程。

(5)代码编程

2.4  常见动态规划类型
  • 线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等

  • 区域动规:石子合并,加分二叉树,统计单词个数等

  • 树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等

  • 背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题等

2.5  动态规划的优化     在NOIP中,动态规划很少需要优化。唯一较为常见的优化方式为“状态压缩”。由于动态规划实质上是一种以时间换空间的解题方式,因此,在空间复杂度上要非常注意。“状态压缩”根据题意找到一个更好的存储状态,避免朴素算法的空间复杂度过大。最经典的例子是NOIP2005中的题目“过河”。 之前在清北学堂信息学训练营的一些入门资料分享给大家:bd5865edf69e5381d0f13f24e0dce120.png

a9b41df641ca63ea28d48a2a8792f4b6.png

e7b9187c186b6c8e8757623b367c85ed.png

274c1d3dedef61da3219d2d0b527e31c.png

0bcc1c9dd0723b14b11a73d0d76ccdad.png

89326bea79877d2fe694415ea8d0c1e7.png

55c8dfce0f55163e54b8721b57b1f9e5.png

c5d1e32b2194e87219120950d370410d.png

a7ddbff0c5ff3f432243b54b9689d630.png

d951895f209583dfac7e7ba34796c851.png

7de5d3abcc4947f84d7df62304f52632.png

8a3b35fa1276121c41940770aa17e0e8.png

36aa77482e5b9ca34c533ebe9f3446b1.png

e615547b023f03dcf7a80629bfcaf660.png

6a8b75ceb974a2d4d8b32acc6cea9c71.png

aa3ed60bb56c7e674aed665bde05494f.png

f9e9f76928cdb5f4060da9ae5f1a4afc.png

2b909f0b38acef3263ea99fcedaa77f5.png

979615d7fcc81f96f178eb64a47ab26a.png

4c11317fd4c5522259792d55957686ba.png

66a0c9e2678de296d8f6eabc1a87db0a.png

c49e9c84032c4a18dd5b4510f66d4e27.png

7bdb5cf6144eb95e4243ae3dfef002b5.png

ccee5b0e0ffbbe9e4de4a1714e9c42eb.png

868900bcf5d9abbd84b724acdc95a444.png

331e0888b429b3d7f01557773161992b.png

8bf3f6c742f5e5d33bbf6a0ee425b3a3.png

e0c21b5afdb37a8ceff2b0a44b47e432.png

6e9d826be43d9d7299f088163798d749.png

438efa84b93209e07e58778e1b35180f.png

c0f1867b34ffcfc31e7dfc63420cf03e.png

527fa877a397661425d702efbde39d1b.png

119e4bbe22723cb1d7b2deea371a6d20.png

dc9ae21f2051ba040e9cecde525c7299.png

7e114d595e37aac8ba6ff737486388ca.png

cab60b95f5cf08dc20796658017d329d.png

397dd52555da5f596f9c2ef7da3e3677.png

0e8c23021f051b8cd09908008ddb6609.png

699ed730c6a2da564ab85ad700669357.png

0fa5f9df9e33b1c6e0130eb31c16bf2a.png

692577b90d2b7ef0a6d9d344841b3db5.png

8d277d585004bbf64bea1341ade5279d.png

2138c0fac3792689024de9875204b47d.png

ef21fcea80e33a7851aa62e2d732d1dd.png

0cd0c5109a257d91ea44dc7f03b1f723.png

aa3eaeede171540dc41fe21c56c4c101.png

4fe79b44bc20b72c6d9536b06c8dc5c1.png

88a0d38696322fd3db644fec39934ec6.png

60003a0c20ac321ab9a941020dcf6505.png

199e498919215d553322afd37f77d2b3.png

85b3d023a14b33ee1daffa2a71827c78.png

4987c51489bbb5e4fa1ee309f3a51c5b.png

96319cbe1ecfa51e3f41fc27992bbd85.png

f9f9553289e0e427d1e35fd60a29c9f3.png

775b1656cce05700c1d737e8e5d59660.png

8cc1ae505113a4414ffdb3d9ea5f952a.png

26e5e6106415b37ac1021f53559bd896.png

  总结一下动态规划一些需要了解的思想, 出自大牛博主“英雄哪里出来 ”

1、递推

递推作为动态规划的基本方法,对理解动态规划起着至关重要的作用。

我们来看下面一个例题:

骨牌铺方格递推

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 744 Accepted Submission(s): 478

Problem Description

在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:

2ac62f52cdfa6b2173de890bebd0001c.png

Input

输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0

Output

            对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。

Sample Input

1
3
2

Sample Output

1
3
2

 这是一个经典的递推问题,如果觉得无从下手,我们可以来看一个更加简单的问题,把问题中的“3”变成“2”(即在一个2XN的长方形方格中铺满1X2的骨牌的方案)。这样问题就简单很多了,我们用f[i]表示2Xi的方格铺满骨牌的方案数,那么考虑第i列,要么竖着放置一个骨牌;要么连同i-1列,横着放置两个骨牌,如图2所示。由于骨牌的长度为1X2,所以在第i列放置的骨牌无法影响到第i-2列。很显然,图一 -1-2中两块黑色的部分分别表示f[i-1]和f[i-2],所以可以得到递推式f[i] = f[i-1] + f[i-2] (i >= 2),并且边界条件f[0] = f[1] = 1。

1666caf441b301b6bc9cdc2c37384293.png

图一 -1-2

再回头来看3 X N的情况,首先可以明确当N等于奇数的时候,方案数一定为0。所以如果用f[i] (i 为偶数) 表示3Xi的方格铺满骨牌的方案数,f[i]的方案数不可能由f[i-1]递推而来。那么我们猜想f[i]和f[i-2]一定是有关系的,如图一 -1-3所示,我们把第i列和第i-1列用1X2的骨牌填满后,轻易转化成了f[i-2]的问题,那是不是代表f[i] = 3*f[i-2]呢?

f461e258a9b1f9c36d8ab1579b0fe0f2.png

图一 -1-3

仔细想想才发现不对,原因是我们少考虑了图一 -1-4的情况,这些情况用图一 -1-3的情况无法表示,再填充完黑色区域后,发现和f[i-4]也有关系,但是还是漏掉了一些情况。

439cd9a6d395bb9f4ada987a132cc1ae.png

图一 -1-4

上面的问题说明我们在设计状态(状态在动态规划中是个很重要的概念,在本章的第4小节会进行介绍总结)的时候的思维定式,当一维的状态已经无法满足我们的需求时,我们可以试着增加一维,用二维来表示状态,用f[i][j]表示(3 X i) + j个多余块的摆放方案数,如图一 -1-5所示:

77151b84144fb2f420280bbed6d8c7c2.png

图一 -1-5

转化成二维后,我们可以轻易写出三种情况的递推式,具体推导方法见图一 -1-6。

f[i][0] = f[i-2][0] + f[i-1][1] + f[i-2][2]

f[i][1] = f[i-1][2]

f[i][2] = f[i][0] + f[i-1][1]

边界条件     f[0][0] = f[1][1] = f[0][2] = 1

5bcd0d8e310f10982dd51a17887cb5e0.png

图一 -1-6

如果N不是很大的情况,到这一步,我们的问题已经完美解决了,其实并不需要求它的通项公式。

如果需要通项公式,那么假设dp[i]为铺满2*n网格的方案数.那么dp[i]=dp[i-1]+dp[i-2]。其中dp[i-1]为铺满2*(n-1)网格的方案数(既然前面的2*(n-1)的网格一已经铺满,那么最后一个只能是竖着放)。dp[i-2]为铺满2*(n-2)网格的方案数(如果前面的2*(n-2)的网格已经铺满,那么最后的只能是横着放,否则会重复).其实这种递推题,在独立思考得到递推公式后,其实可以将输入样例带进去验证一下.需要注意的是dp[50]已经到200多亿了,这时候需要用long long 。

2、记忆化搜索

      递推说白了就是在知道前i-1项的值的前提下,计算第i项的值,而记忆化搜索则是另外一种思路。它是直接计算第i项,需要用到第 j 项的值( j < i)时去查表,如果表里已经有第 j 项的话,则直接取出来用,否则递归计算第 j 项,并且在计算完毕后把值记录在表中。记忆化搜索在求解多维的情况下比递推更加方便,【例题3】是我遇到的第一个记忆化搜索的问题,记忆犹新。

      【例题3】这个问题直接给出了一段求函数w(a, b, c)的伪代码:

      function w(a, b, c):

       if a <=0 or b <=0 or c <=0, then returns:1

       if a >20or b >20or c >20, then returns: w(20,20,20)

       if a < b and b < c, then returns: w(a, b, c-1)+ w(a, b-1, c-1)- w(a, b-1, c)    

       otherwise it returns: w(a-1, b, c)+ w(a-1, b-1, c)+ w(a-1, b, c-1)

      要求给定a, b, c,求w(a, b, c)的值。

      乍看下只要将伪代码翻译成实际代码,然后直接对于给定的a, b, c,调用函数w(a, b, c)就能得到值了。但是只要稍加分析就能看出这个函数的时间复杂度是指数级的(尽管这个三元组的最大元素只有20,这是个陷阱)。对于任意一个三元组(a, b, c),w(a, b, c)可能被计算多次,而对于固定的(a, b, c),w(a, b, c)其实是个固定的值,没必要多次计算,所以只要将计算过的值保存在f[a][b][c]中,整个计算就只有一次了,总的时间复杂度就是O(n^3),这个问题的n只有20。

3、状态和状态转移         

      在介绍递推和记忆化搜索的时候,都会涉及到一个词---状态,它表示了解决某一问题的中间结果,这是一个比较抽象的概念,例如【例题1】中的f[i][j],【例题2】中的FA[i]、FB[i],【例题3】中的f[a][b][c],无论是递推还是记忆化搜索,首先要设计出合适的状态,然后通过状态的特征建立状态转移方程(f[i] = f[i-1] + f[i-2] 就是一个简单的状态转移方程)。

4、最优化原理和最优子结构

      在介如果问题的最优解包含的子问题的解也是最优的,就称该问题具有最有子结构,即满足最优化原理。这里我尽力减少理论化的概念,而改用一个简单的例题来加深对这句话的理解。

     【例题4】给定一个长度为n(1 <= n <= 1000)的整数序列a[i],求它的一个子序列(子序列即在原序列任意位置删除0或多个元素后的序列),满足如下条件:

      1、该序列单调递增;

      2、在所有满足条件1的序列中长度是最长的;

      这个问题是经典的动态规划问题,被称为最长单调子序列。

      我们假设现在没有任何动态规划的基础,那么看到这个问题首先想到的是什么?

      我想到的是万金油算法---枚举(DFS),即枚举a[i]这个元素取或不取,所有取的元素组成一个合法的子序列,枚举的时候需要满足单调递增这个限制,那么对于一个n个元素的序列,最坏时间复杂度自然就是O(2n),n等于30就已经很变态了更别说是1000。但是方向是对的,动态规划求解之前先试想一下搜索的正确性,这里搜索的正确性是很显然的,因为已经枚举了所有情况,总有一种情况是我们要求的解。我们尝试将搜索的算法进行一些改进,假设第i个数取的情况下已经搜索出的最大长度记录在数组d中,即用d[i]表示当前搜索到的以a[i]结尾的最长单调子序列的长度,那么如果下次搜索得到的序列长度小于等于d[i],就不必往下搜索了(因为即便继续往后枚举,能够得到的解必定不会比之前更长);反之,则需要更新d[i]的值。如图一-4-1,红色路径表示第一次搜索得到的一个最长子序列1、2、3、5,蓝色路径表示第二次搜索,当枚举第3个元素取的情况时,发现以第3个数结尾的最长长度d[3] = 3,比本次枚举的长度要大(本次枚举的长度为2),所以放弃往下枚举,大大减少了搜索的状态空间。

eca4b2dde8a1f09cee75ecb3bae6d455.png

图一-4-1

      这时候,我们其实已经不经意间设计好了状态,就是上文中提到的那个d[i]数组,它表示的是以a[i]结尾的最长单调子序列的长度,那么对于任意的i,d[i] 一定等于 d[j] + 1 ( j < i ),而且还得满足 a[j] < a[i]。因为这里的d[i]表示的是最长长度,所以d[i]的表达式可以更加明确,即:

      d[i] = max{ d[j] | j < i && a[j] < a[i] } + 1

      这个表达式很好的阐释了最优化原理,其中d[j]作为d[i]的子问题,d[i]最长(优)当且仅当d[j]最长(优)。当然,这个方程就是这个问题的状态转移方程。状态总数量O(n), 每次转移需要用到前i项的结果,平摊下来也是O(n)的,所以该问题的时间复杂度是O(n^2),然而它并不是求解这类问题的最优解,下文会提到最长单调子序列的O(nlogn)的优化算法。


5、决策和无后效性

      一个状态演变到另一个状态,往往是通过“决策”来进行的。有了“决策”,就会有状态转移。而

无后效性,就是一旦某个状态确定后,它之前的状态无法对它之后的状态产生“效应”(影响)。

      【例题5】老王想在未来的n年内每年都持有电脑,m(y, z)表示第y年到第z年的电脑维护费用,其中y的范围为[1, n],z的范围为[y, n],c表示买一台新的电脑的固定费用。给定矩阵m,固定费用c,求在未来n年都有电脑的最少花费。

考虑第 i 年是否要换电脑,换和不换是不一样的决策,那么我们定义一个二元组(a, b),其中 a < b,它表示了第a年和第b年都要换电脑(第a年和第b年之间不再换电脑),如果假设我们到第a年为止换电脑的最优方案已经确定,那么第a年以前如何换电脑的一些列步骤变得不再重要,因为它并不会影响第b年的情况,这就是无后效性。

更加具体得,令d[i]表示在第i年买了一台电脑的最小花费(由于这台电脑能用多久不确定,所以第i年的维护费用暂时不计在这里面),如果上一次更换电脑的时间在第j年,那么第j年更换电脑到第i年之前的总开销就是c + m(j, i-1),于是有状态转移方程:     

d[i] = min{ d[j] + m(j, i-1) |  1 <=  j < i  }

 + c

这里的d[i]并不是最后问题的解,因为它漏算了第i年到第n年的维护费用,所以最后问题的答案:

ans  = min{ d[i] + m(i, n)  | 1 <= i < n }

我们发现两个方程看起来很类似,其实是可以合并的,我们可以假设第n+1年必须换电脑,并且第n+1年换电脑的费用为0,那么整个阶段的状态转移方程就是:

d[i] = min{ d[j] + m(j, i-1) | 1 <= j < i } + w(i)    其中w(i) = (i==n+1)?0:c;

d[n+1]就是我们需要求的最小费用了。

本文动态规划思想部分内容由博主“英雄哪里出来 ”整理,原文地址:http://www.cppblog.com/menjitianya/archive/2015/10/23/212084.html,希望本文能对你有所帮助!

e7021fc856d7267707168424dad18de9.png

0039967d84ba8124487da9f4bba33280.png6822161ee79fcddc6d561c9ce7af368d.png

往期精选内容

NOIP2020考前刷题冲刺班助你圆梦OI!

CSP-J/S2020第二轮入门级+提高级真题

CSP-J/S2020第一轮评级规则发布并开始受理第一轮证书申请

中国科学技术大学2020级少年班录取名单发布

IOI2020国家队队员周雨扬的信息学竞赛之路!

半个月连夺两枚全国金牌 广州16岁高一学霸被北大预录取!

NOI2020胜利闭幕,官方获奖名单

IOI2020信息学国家队4人名单及国家集训队50人大名单

NOI2020冬令营获奖名单分析,看那些省份中学表现好

NOI2020 第一试真题出炉,一起来感受下

NOI2020 第二试真题发布

认准这35项!2020-2021学年面向中小学生的全国性竞赛活动名单

清华大学 北京大学2020年统招批次录取分数线公布

CCF NOI2020笔试题库发布,助选手备考

CCF关于NOI2020省选举办时间和方式的通知

CCF NOI2020获奖规则及各省名额分配方案

姚班信息学大牛讲座视频-如何学好信息学竞赛(入门篇)

IOI2020 将线上进行比赛,IOI 2021 2024举办方确定

部分地区中考加分,又一批中学公布中考认可信息学特长生!

华南师大附中,绍兴一中,人大附中朝阳学校招收特长生,认可信息学!

天津2020特长生招生政策发布,信息学竞赛一二等奖均可报名!

浙江省温州市部分重点中学招收信息学特长生

2020年乌鲁木齐八一中学信息学奥赛特长生招生

北京多所中学及岭南师范学院附中招生科技类特长生!

CCF关于恢复NOIP竞赛的公告

强基计划解读,一切向着好的方向发展!

CSP-J/S认证第一轮初赛S、J组答案

逾10万人参加首次CSP-J/S认证,附CSP-S/J组初赛试题及参考答案

NOI各省负责人联系方式!

学好信竞-浅谈信息学竞赛考场策略及程序测试

详细盘点清华姚班 智班,北大 浙大图灵班等多所高校AI专业实力!

清华大学计算机姚班、人工智能学堂班(智班)选拔方案出炉!

APIO2019中国区获奖名单公布,学军中学 杭州二中等表现出色

五大学科竞赛国家队23人大名单出炉(各省,中学分布统计)

IOI2019(国际信息学奥林匹克)中国队名单出炉

最详细解析低分进名校三大途径:自主招生、综合评价、高校专项计划!

2019年保送生资格名单公示

再见,OI-大牛HZW亲笔,分享OI生涯记录,不变的是坚持和热爱!

NOIP复赛知识点简述及复赛算法总结!

根据信息学竞赛之路带你了解信息学竞赛流程

教育部出台高中新课标,信息学竞赛相关内容被编入必修课程!

从搜狗CEO王小川(信息学金牌),看这二十几年中国奥赛金牌的去向

揭晓高薪专业排行榜,计算机专业薪资最高!哪些专业最具潜力?

一个清华保送生妈妈对竞赛的感受,自主招生家长都要看看!

计算机科学与技术专业全国大学排行榜!

为什么这些孩子初中就能被清华北大签约

(1) 为什么有“编程思维”和数学能力强的人更优秀?

(2)清北独家录制NOIP成功者说学习视频!!!

(3)我们为什么要对孩子进行编程教育?

(4)信息学竞赛答家长问题

1.信息学竞赛,你想了解的知识都在这里

2.信息学奥赛(NOIP)初赛学习方法推荐

3.信息学奥赛(NOIP)复赛学习方法推荐

4.大牛为你推荐十本最适合信息学竞赛的书籍

5.信息学奥赛有那么重要吗?

6.参加编程竞赛对实际工作的用处

7.清北学堂独家录制NOIP考试技巧讲座

8.在线编程挑战赛第一名:我是这么学算法的

9.信息学竞赛如何学习及准备攻略!

10.凭什么我得了信息学奥赛国家一等奖

11.榜样 | 北大降200分要这个诸暨天才少年

12.OI金牌教练胡芳:爱和成长的故事

13.信息学竞赛,一个让孩子不需要再去挤独木桥的方向

14.新学期必须了解的学科竞赛与自主招生时间!

15.北大录取生陈代超:在信息学中找到“思维图谱”

16.国务院发文支持编程教育进入中小学,中国人工智能厚积薄发

关注「信息学竞赛」

看更多信息学趣闻与知识

↓↓↓

d28217bb8dc16c0de774e669c554b09a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值