2012集训队讲座-动态规划
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最大子串和
题目大意: 给出一个整数串a,a[i]表示其中的第i个整数,
a[i]有正有负,求其中一个连续子串,使得该子串 的和最大。
状态表示: f[i]表示以第i个整数结尾的子串所能得到的最
大和。 状态转移方程:
f[i]=max{f[i-1]+a[i] , a[i]}
最长上升子序列
题目大意: 给出一个整数串a,a[i]表示其中的第i个整数,
f[i.left][1]+f[i.right][0] }
双串匹配模型
双串匹配模型往往关心两个串的公共模本,两个串 的相似程度,两个串通过怎样的删除和变换能达到 一致等等。
例题:
最长公共子序列(LCS)
最长公共子序列
题目大意:
给定两个串S1和S2,求两个串的最长公共子 序列。
状态表示:
f[i][j]表示第一个串的前i项和第二个串的前j项 的最长公共子序列的长度。
最长上升子序列
状态表示: f[i]表示以第i个数为结尾的子序列的最大长度。
状态转移方程: f[i]=max{f[j]+1,f[i]}(0<=j<i && a[j]<a[i])
矩阵连乘
题目大意: 给出一个矩Hale Waihona Puke Baidu的连乘序列,由于矩阵乘法具有
结合性,所以希望找出一种计算顺序,使得计算时 进行的乘法操作最少。
致的分类:
线性(一维/串、环)模型 双(多)串匹配模型 树状模型 基于数值的模型 基于状态压缩的模型 其它
线性模型
一个序列、一串数字或者是一个字符串等等 对于“环”,我们可以将其展开形成“非环”,通
常可以待操作的串复制一遍接在后面,形成双倍长 度的串来表示原先的环。 例题:
最大子串和 最长上升子序列(LIS) 矩阵连乘
的求其中最长的一个子序列,使得该子序列是递增 的。
子序列的定义: 设a的长度为n,对于一个长度为m(m<=n) 的串b,对于任意i(0<i<m-1)有0<b[i]<n,且 b[i]<b[i+1]。 则a[b[0]],a[b[1]],……,a[b[m]],是a的一个子序 列。简单来说子序列就是元素可不连续的子串。
f[i][j]表示第i个矩阵到第j个矩阵按一定的次序 相乘,最后得到一个矩阵所需要的最少乘法次数。
矩阵连乘
状态转移方程: 枚举分割点k,将区间[i,j]分割为[i,k]和[k+1,j]两
个部分,即两个子问题,当两个部分分别以最优方 式得到两个矩阵后,再将这两个矩阵相乘。
f[i][j]=min{f[i][k]+f[k+1][j]+p[i]*p[k+1]*p[j+1]} (i<=k<j)
假设给定矩阵为A,B,C,它们的规模分别为x×y, y×z,z×t,则:
计算(AB)C需要x×y×z+x×z×t次乘法; 计算A(BC)需要x×y×t+y×z×t次乘法。
矩阵连乘
状态表示: 由于矩阵A×B能相乘,必定A的列数等于B的
行数,故用长度为n+1的整数序列p表示n个矩阵, 第i个矩阵的规模为p[i]×p[i+1]。
动态规划的基本概念
动态规划用于解决多阶段决策过程的最优化问题。 将问题划分为若干个相互联系的阶段,每个阶段有
一定的状态,并且可以通过一定的决策达到下一阶 段的某个状态。 一般来说,决策的过程通过状态转移方程来体现。
动态规划的基本概念
最优子结构性质 对于一个最优化策略问题,不论过去状态和决
每个节点可以被染成红色、绿色或蓝色。并且,一 个节点与其子节点的颜色必须不同,如果该节点有 两个子节点,那么这两个子节点的颜色也必须不相 同。给定一棵二叉树的二叉树序列,请求出这棵树 中最多和最少有多少个点能够被染成绿色。
三色二叉树
状态表示: 由于本题的问题背景既是建立在一棵二叉树上,
所以我们就先通过输入的二叉树序列建立一棵二叉 树。再以树的结点来表示状态,由于本题还要记录 结点的颜色信息,所以给结点再增加一维用作表示 颜色,但是由于本题所求的目标只和绿色有关,所 以红色和蓝色本质上是一样的,直接用非绿色表示。 那么:
策如何,对前面的决策所形成的状态而言,余下的 诸决策必须构成最优策略。简而言之,一个最优化 策略问题的子问题总是最优的。 无后效性
将各阶段按照一定的次序排列好之后,对于某 个给定的阶段状态,它以前各阶段的状态无法直接 影响它未来的决策,而只能通过当前的这个状态。
动态规划的模型分类
其实,动态规划没有固定的模型或分类可言! 以下只是根据以往的竞赛试题的一些相似性进行大
状态转移方程:
f[i-1][j-1]+1
, S1[i]==S2[j]
f[i][j]= max{f[i-1][j],f[i][j-1]} , S1[i]!=S2[j]
树状模型
问题的模型具有树形结构,那么它就有天然的适用 于划分的子结构:子树。
无论是有根树还是无根树,我们总是把树建立起来, 然后以r为根来考虑问题和书写程序。
例题:
三色二叉树(FOJ 1022) 洞穴照明(FOJ 2083)
三色二叉树
题目大意: 一棵二叉树可以按照如下规则表示成一个由0、
1、2组成的字符序列,我们称之为“二叉树序列S”:
例如,下图所表示的二叉树可以用二叉树序列 S=21200110来表示。
三色二叉树
题目大意: 你的任务是要对一棵二叉树的节点进行染色。
动态规划
2012年7月9日
引言
动态规划(dynamic programming)是在上个世纪 50年代提出的一种用于多阶段决策的方法。它是运 筹学的一个分支。
动态规划因其高效性被广泛应用在管理、调度和最 优化决策中。
根据现有资料,从上个世纪90年代初开始,信息学 竞赛就出现了使用动态规划思想来解决题目的先例, 并自此长盛不衰。
f[i][0]表示结点i染了绿色的情况下,以i为根的 子树所能得到的最多绿色结点的数量。
f[i][1]表示结点i没染绿色的情况下的最多数量。
三色二叉树
状态转移方程: 当结点i被染成绿色后,其左右儿子都不能染成
绿色,而当结点i被染成非绿色后,其左右儿子中 可有一个被染成绿色,那么:
f[i][0]=f[i.left][1]+f[i.right][1]+1; f[i][1]=max{ f[i.left][0]+f[i.right][1] ,