动态规划专题(六):树型动态规划

合集下载

动态规划

动态规划

多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状 态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化 问题的方法为动态规划方法 。
任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适 用动态规划的问题必须满足最优化原理和无后效性 。
动态规划
运筹学的分支
01 原理
03 局限性
目录
02 分类
动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年 代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理, 从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域, 并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了 显著的效果 。
最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成 的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足 最优化原理又称其具有最优子结构性质 。
将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来 的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又 称为无后效性 。
状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因 素。在上面的例子中状态就是某阶段的出发位置,它既是该阶段某路的起点,同时又是前一阶段某支路的终点 。

第6章动态规划

第6章动态规划

第6章 动态规划动态规划(Dynamic Programming )是解决多阶段决策过程最优化的一种有用的数学方法。

它是由美国学者Richard .Bellman 在1951年提出的,1957年他的专著《动态规划》一书问世,标志着运筹学的一个重要分支-动态规划的诞生.动态规划也是一种将多变量问题转化为单变量问题的一种方法。

在动态规划中,把困难的多阶段决策问题变换成一系列相互联系的比较容易的单阶段问题一个个地求解。

动态规划是考察解决问题的一种途径 ,而不是一种特殊的算法,不像线性规划那样有统一的数学模型和算法(如单纯形法).事实上,在运用其解决问题的过程中还需要运用其它的优化算法。

因此,动态规划不像其它方法局限于解决某一类问题,它可以解决各类多阶段决策问题。

动态规划在工程技术、经济管理等社会各个领域都有着广泛的应用,并且获得了显著的效果。

在经济管理方面,动态规划可以用来解决最优路径问题、资源分配问题、生产调度问题、库存管理问题、排序问题、设备更新问题以及生产过程最优控制问题等,是经济管理中一种重要的决策技术。

许多规划问题用动态规划的方法来处理,常比线性规划或非线性规划更有效。

特别是对于离散的问题,由于解析数学无法发挥作用,动态规划便成为了一种非常有用的工具。

动态规划可以按照决策过程的演变是否确定分为确定性动态规划和随机性动态规划;也可以按照决策变量的取值是否连续分为连续性动态规划和离散性动态规划。

本教材主要介绍动态规划的基本概念、理论和方法,并通过典型的案例说明这些理论和方法的应用。

6.1动态规划的基本理论6.1.1多阶段决策过程的数学描述有这样一类活动过程,其整个过程可分为若干相互联系的阶段,每一阶段都要作出相应的决策,以使整个过程达到最佳的活动效果。

任何一个阶段(stage ,即决策点)都是由输入(input )、决策(decision )、状态转移律(transformation function )和输出(output )构成的,如图6-1(a )所示.其中输入和输出也称为状态(state ),输入称为输入状态,输出称为输出状态。

树型动态规划(C++版)

树型动态规划(C++版)

树型动态规划补充二叉树的遍历的相关知识:在二叉树的应用中,常常要求在树中查找具有某种特征的结点,或者对全部结点逐一进行某种处理。

这就是二叉树的遍历问题。

所谓二叉树的遍历是指按一定的规律和次序访问树中的各个结点,而且每个结点仅被访问一次。

“访问”的含义很广,可以是对结点作各种处理,如输出结点的信息等。

遍历一般按照从左到右的顺序,共有3 种遍历方法,先(根)序遍历,中(根)序遍历,后(根)序遍历。

先序遍历的操作定义如下:若二叉树为空,则空操作,否则①访问根结点②先序遍历左子树③先序遍历右子树先序遍历右图结果为:124753689中序遍历的操作定义如下:若二叉树为空,则空操作,否则①中序遍历左子树②访问根结点③中序遍历右子树中序遍历右图结果为:742513869后序遍历的操作定义如下:若二叉树为空,则空操作,否则①后序遍历左子树②后序遍历右子树③访问根结点后序遍历右图结果为:745289631满二叉树:一棵深度为h且有 2^h-1个结点的二叉树。

满二叉树一定为完全二叉树,但是完全二叉树不一定为满二叉树。

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

满二叉树有如下性质:如果一颗树深度为h,最大层数为k,且深度与最大层数相同,即k=h;1、它的叶子数是:2^(h-1)2、第k层的结点数是:2^(k-1)3、总结点数是:2^k-1 (2的k次方减一)4、总节点数一定是奇数。

若设二叉树的深度为h,除第h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树。

1、二叉树的序遍历题目描述Description求一棵二叉树的前序遍历,中序遍历和后序遍历输入描述Input Description第一行一个整数n,表示这棵树的节点个数。

接下来n行每行2个整数L和R。

第6章-动态规划

第6章-动态规划
f*n(Sn)为从第n个阶段到终点的最短距离, f*n+1(Sn+1)为从第n+1个阶段到终点的最短距离, dn(Sn,Xn)为第n个阶段的距离,f*5(S5)为递推 的起点,通常为已知的。
求解过程
由最后一个阶段的优化开始,按逆向顺序逐步 向前一阶段扩展,并将后一阶段的优化结果带 到扩展后的阶段中去,以此逐步向前推进,直 至得到全过程的优化结果。
f1
(
A)
min
dd11
( (
A, A,
B1) B2 )
ff22((BB12))
min
4 9
9 11
13
d1( A, B3) f2 (B3)
5 13
其最短路线是A→ B1→C2 →D2 →E ,相应的决 策变量是u1(A)=B1
因此,最优策略序列是:
u1(A) =B1, u2(B1)=C2, u3(C2)=D2, u4(D2)=E
5 8 C2 4 6 4
4 C3 2
C3
D1 4 2 6
D2 9 7
D3 5
D4
E1 1 F
E2 2
E5
F
动态规划的逆序解法与顺序解法
逆序(递推)解法:即由最后一段到第一段逐步 求出各点到终点的最短路线,最后求出A点到E点 的最短路线。运用逆序递推方法的好处是可以始 终盯住目标,不致脱离最终目标。 顺序解法:其寻优方向与过程的行进方向相同, 求解时是从第一段开始计算逐段向后推进,计算 后一阶段时要用到前一段求优的结果,最后一段 的计算结果就是全过程的最优结果。
B1
A
4+9=13
d(u1)+f2
B2
B3
f1(s1) u1*

树形动态规划

树形动态规划

树形动态规划动态规划: 问题可以分解成若⼲相互联系的阶段,在每⼀个阶段都要做出决策,全部过程的决策是⼀个决策序列。

要使整个活动的总体效果达到最优的问题,称为多阶段决策问题。

动态规划就是解决多阶段决策最优化问题的⼀种思想⽅法。

阶段: 将所给问题的过程,按时间或空间(树归中是空间,即层数)特征分解成若⼲相互联系的阶段,以便按次序去求每阶段的解。

状态: 各阶段开始时的客观条件叫做状态。

决策: 当各段的状态取定以后,就可以做出不同的决定,从⽽确定下⼀阶段的状态,这种决定称为决策。

(即孩⼦节点和⽗亲节点的关系)策略: 由开始到终点的全过程中,由每段决策组成的决策序列称为全过程策略,简称策略。

状态转移⽅程: 前⼀阶段的终点就是后⼀阶段的起点,前⼀阶段的决策选择导出了后⼀阶段的状态,这种关系描述了由k阶段到k+1阶段(在树中是孩⼦节点和⽗亲节点)状态的演变规律,称为状态转移⽅程。

⽬标函数与最优化概念: ⽬标函数是衡量多阶段决策过程优劣的准则。

最优化概念是在⼀定条件下找到⼀个途径,经过按题⽬具体性质所确定的运算以后,使全过程的总效益达到最优。

树的特点与性质:1、有n个点,n-1条边的⽆向图,任意两顶点间可达2、⽆向图中任意两个点间有且只有⼀条路3、⼀个点⾄多有⼀个前趋,但可以有多个后继4、⽆向图中没有环;拿到⼀道树规题,我们有以下3个步骤需要执⾏:1. 判断是否是⼀道树规题:即判断数据结构是否是⼀棵树,然后是否符合动态规划的要求。

如果是,那么执⾏以下步骤,如果不是,那么换台。

2. 建树:通过数据量和题⽬要求,选择合适的树的存储⽅式。

如果节点数⼩于5000,那么我们可以⽤邻接矩阵存储,如果更⼤可以⽤邻接表来存储(注意边要开到2*n,因为是双向的。

这是⾎与泪的教训)。

如果是⼆叉树或者是需要多叉转⼆叉,那么我们可以⽤两个⼀维数组brother[],child[]来存储(这⼀点下⾯会仔细数的)。

3. 写出树规⽅程:通过观察孩⼦和⽗亲之间的关系建⽴⽅程。

树形动态规划

树形动态规划

【核心代码】
【问题描述】
建立一个古城堡,城堡中的路形成一棵树。要在这棵树的结
点上放置最少数目的士兵,使得这些士兵能瞭望到所有的路。
一个结点上的士兵时,可以瞭望到所有与该结点相连的边。
请你编一个程序,给定一棵树,计算出需要放置最少的士兵
。 【样例输入】
0
Hale Waihona Puke 40111223
1
20
30 【样例输出】
2
3
求一棵边带权的树中的点,使得此点到树中的其他结点的最 远距离最近。
解法:从任意一点i出发的最长路径的可能形态有两种: u[i]:向上,即终点不在以i为根的子树中的最长路长度; d1[i]:向下,即终点在以i为根的子树中的最长路长度;
关键:如何计算u[i]。i点向上的路径必经过(i,prt[i]), 而prt[i]又引出了两条路径:一条是u[prt[i]];另一条是prt[i] 向下的路,该路径不能途径i点,否则会产生重复计算。
当然,x=0是一个特例,因为虚拟的根节点实际上不需要被选 修,此时背包总容积应为t。我们用分组背包进行树形DP的状态转 移。
这类题目被称为背包类树形DP,又称有树形依赖的背包问题。 在状态转移时,我们要处理的实际上就是一个分组背包问题。
【核心代码】
【问题描述】
如果一个数x的约数和y(不包括它本身)比它本身小,那么
设:f(i,0):i被父亲看时,以i为根的子树所需最少士兵; f(i,1):i被儿子看时,以i为根的子树所需最少士兵; f(i,2):在i安排警卫时,以i为根的子树所需最少士兵。
【思路点拨】 针对这三种状态,设计出状态转移方程: ①f(i,0):i被父亲看到,这时i没有安排警卫,i的儿子
要么安排警卫,要么被它的后代看到,则:

树形动态规划

树形动态规划

总结
这堂课讲的内容只能算是基础,题目中 树的条件直接给出,动归的指向性也很 明显。有些难度较高的树型动态规划题, 在题目中会把“树”的条件隐藏,还有 些题目需要经过适当转化才能找到最优 子结构。选手们只有平时多做题,多思 考,能力提升了,才能应对各种变化。
树型动态规划
JSOI2010冬令营
引言
树是一种特殊的图,可以描述比较复杂的关系,而大 多数动归都是在一维二维这种规则的背景下的,再加 上树递归定义的性质,可以说是一种非常合适的动归 框架,树型动态规划就成为动规中重要的一类题型。
因为树可以描述比较复杂的关系,这对选手分析问题 的能力有较高的要求,在寻找最优子结构、组织状态 时往往需要创造性思维,而且树型动态规划对数学要 求不高,一般不涉及单调性优化,所以竞赛中往往将 它作为侧重考察选手分析思考能力的题出现。
例二、问题分析
三种情况
例二、问题分析
|XY|+|YZ|
|XY|+|YX|+|XZ|
例二、问题分析
例二、问题分析
现在只要考虑这一种情况 要满足|Xa|+|aY|≦ |Xa|+|aZ|
|Xa|+2|aY|+|aZ|最大
例二、问题分析
现在我们考虑分叉点a
很明显,要使目标值最大,XYZ必是离a最 远的三点,且在以a为根的三棵不同子树中。 Y就是三点中离a第二远的点。 显然,三个点要么位于以a为根的子树中, 要么位于以a为根的子树外。
例一、问题描述
给定一棵树,树的每个节点有一个权值, 要求从中选出一些不相邻的点,使选出 的节点权值和最大。
例一、确定状态
对于大多数树型动态规划问题,都是用 一棵子树的根节点编号来作为代表这棵 子树的第一维状态,然后再根据需要加 维。

动态规划基础、进阶与优化

动态规划基础、进阶与优化

山东师大附中陈键飞前言自古以来就是NOIP的重要考察内容,在联赛中占的分量大。

对选手能力有一定要求,需要能够熟练地建立动态规划模型。

需要大量做题,初学者不易掌握其思想。

目录基础:基本概念背包问题——一类典型应用 进阶:更多的问题树形DP状态压缩优化:减少状态数目减少状态转移(决策)时间基本概念最长上升子序列状态:f[i]能完全地表示出问题某个或某些本质相同的形态决策:f[i]=min(f[j]+1)状态由哪个状态转移得到阶段:每个i前面的阶段决定后面的阶段,后面的阶段由前面的状态转移得到基本概念石子合并状态f[i,j]决策f[i,j]=min(f[i,k]+f[k+1,j])+w[i,j] 阶段j-i (区间大小)基本概念无后效性后面阶段的状态只受前面阶段的状态的影响 对于任意两个状态,只能单向的进行转移基本概念拓扑图(有向无环图)无后效性f[i]=min(f[j])+1基本概念 非拓扑图(可能有环) 有后效性a →b →c ?b →c →a ?a bc 51111基本概念最优子问题问题最优,只需子问题最优,与到达子问题的路径无关3 5 24 6f(5)最优,只需f(4)最优,与f(4)是怎么到达的无关与路线具体是3 4 6还是2 4 6无关基本概念最优子问题输出1~n中∑(A(i,p[i]))最大的排列f(i)表示用1~n组成的长度为i的序列? 与到达子问题的路径有关!1 4 3 →6 ?4 2 3 →6 ?基本概念无后效性、最优子问题是否能满足与状态的表示,状态的转移,阶段的划分有关背包问题——一类典型应用 给定n个货币,面值各不相同,问能否凑出m元钱f[i,j]表示前i个货币能否凑出j元f[i,j] = f[i-1,j] (不选j)or f[i-1,j-w[i]](选j)背包问题——一类典型应用 给定n种货币,每种无限多个,面值各不相同,问能否凑出m元钱f[i,j]表示前i种货币能否凑出j元f[i,j]=f[i-1,j] or f[i,j-w[i]]背包问题——一类典型应用 给定n种货币,第i种有A i个,面值W i,问能否凑出m 元钱将每种货币i拆成A i个价值为W i的货币O(m∑A i)将每种货币i拆成价值为W i,2W i,4W i,8W i……的货币O(m∑log A i)单调队列O(mn) ,暂时跳过背包问题——一类典型应用 给定n种货币分为k组,每组只能选一个,问能否凑出m元f[i,j,k]表示用前1~i-1组和第i组的前j个能否凑出k元。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态规划专题(六):树型动态规划(重庆巴蜀中学黄新军)信息学竞赛中通常会出现这样的问题:给一棵树,要求以最少的代价(或取得最大收益)完成给定的操作。

有很多问题都是在树和最优性的基础上进行了扩充和加强,从而变成了棘手的问题。

这类问题通常规模较大,枚举算法的效率无法胜任,贪心算法不能得到最优解,因此要用动态规划解决。

和一般动态规划问题一样,这类问题的解决要考虑如下三步:1、确立状态:几乎所以的问题都要保存以某结点为根的子树的情况,但是要根据具体问题考虑是否要加维,加几维,如何加维。

2、状态转移:状态转移的变化比较多,要根据具体问题具体分析,这也是本文例题分析的重点。

3、算法实现:由于模型建立在树上,即为树型动态规划。

【例题1】二叉苹果树【问题描述】有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点),这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。

我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。

下面是一颗有4个树枝的树:现在这颗树枝条太多了,需要剪枝。

但是一些树枝上长有苹果。

给定需要保留的树枝数量,求出最多能留住多少苹果。

【文件输入】第1行2个数,N和Q(1<=Q<=N,1<N<=100)。

N表示树的结点数,Q表示要保留的树枝数量。

接下来N-1行描述树枝的信息。

每行3个整数,前两个是它连接的结点的编号。

第3个数是这根树枝上苹果的数量。

每根树枝上的苹果不超过30000个。

【文件输出】输出文件仅一个数,表示最多能留住的苹果的数量。

【样例输入】5 21 3 11 4 102 3 203 5 20【样例输出】21【思路点拨】由题意可知,需要保留的树枝数量为Q条,即保留结点t=Q+1个。

树根必须保留,可以分三种情况讨论保留苹果的最大数。

①树根的左子树为空,全部保留右子树,右子树中保留t-1个结点;②树根的右子树为空,全部保留左子树,左子树中保留t-1个结点;③树根的两棵子树都为非空,设左子树保留k个结点,则右子树保留t-k-1个结点。

要得到保留树根时的苹果最大数,只需要求上述三个方案中的最大值。

设树根为V,左儿子为ch[v,1],右儿子为ch[v,2],对于①方案,要取得该方案的最大值,需要取得以ch[v,2]为根,保留t-1个结点的最大值。

这时同样具有上述三种方案。

其他②③情况同理;由此可以看出,该问题具有明显的最优子结构性质,每个问题都与左右儿子结点有关系,但不与孙子结点发生关系,具备无后效性;且计算方案时,搜索子结构时具备重叠性,所以可以用动态规划来解决。

阶段和状态:f[v,t]:表示以v为根的树上保留t个节点的最大权值和。

设ch[v,1],ch[v,2]分别存v节点的左右孩子。

状态转移方程:f[v,t]=max{f[ch[v,1]][i]+f[ch[v,2]][t-i-1]+num[v]}(0<=i<=t-1)初始化:f[v,t]=0,(t=0);f[v,t]=num[v];(ch[v,1]=0且ch[v,2]=0)Answer=f[1,t];【例题2】加分二叉树(NOIP2003)【问题描述】设一棵n个结点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为结点编号。

每个结点都有一个分数(均为正整数),记第i个结点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:subtree的左子树的加分×subtree的右子树的加分+subtree的根的分数若某个子树为空,规定其加分为1,叶子的加分就是叶结点本身的分数。

不考虑它的空子树。

试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。

要求输出;(1)tree的最高加分(2)tree的前序遍历【输入格式】第1行:一个整数n(n<30),为结点个数。

第2行:n个用空格隔开的整数,为每个结点的分数(分数<100)。

【输出格式】第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。

第2行:n个用空格隔开的整数,为该树的前序遍历。

【输入样例】55 7 1 2 10【输出样例】1453 1 24 5【思路点拨】本题已经说明了问题的模型是一棵树,而且是一棵中序遍历为1,2,3,…,n的二叉树。

而对于一棵中序遍历为1,2,3,…,n的二叉树有很多种形式,对于样例,下图就列出了3种形式,而按题意,第三种形式得到的得分最大。

性质:中序遍历是按“左-根-右”方式进行遍历二叉树,因此二叉树左孩子遍历序列一定在根结点的左边,右孩子遍历序列一定在根结点的右边!因此,假设二叉树的根结点为k,那么中序遍历为1,2,…,n的遍历序列,左孩子序列为1,2,…,k-1,右孩子序列为k+1,k+2,…,n,如下图:我们思考的方式变为,要使得整棵树最优,必须左孩子和右孩子都最优,因此设f[i][j]表示以结点i,i+1,i+2…,j组成的二叉树所得的最大加分;设根为k,则枚举根结点。

d[k]表示k结点的最大分值;故有:f[i,j]=max{f[i,k-1]*f[k+1,j] +d[k]};(1<=i<=k<=j<=n)初始条件:f[i,i]=d[k]Answer=f[1,n]时间复杂度:O(n3)题目还要求输出最大加分树的前序遍历序列,因此要构造这个树,我们只需记录每次的决策值,令p[i,j]=k,表示中序遍历为i,i+1,…,j的二叉树的取最优决策时的根结点为k,最后前序遍历这个树即可。

【例题3】选课(CTSC1997)【问题描述】大学里实行学分。

每门课程都有一定的学分,学生只要选修了这门课并考核通过就能获得相应的学分。

学生最后的学分是他选修的各门课的学分的总和。

每个学生都要选择规定数量的课程。

其中有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其他的一些课程的基础上才能选修。

例如,《数据结构》必须在选修了《高级语言程序设计》之后才能选修。

我们称《高级语言程序设计》是《数据结构》的先修课。

每门课的直接先修课最多只有一门。

两门课也可能存在相同的先修课。

为便于表述每。

下面举例说明:上例中1是2的先修课,即如果要选修2,则1必定已被选过。

同样,如果要选修3,那么1和2都一定已被选修过。

学生不可能学完大学所开设的所有课程,因此必须在入学时选定自己要学的课程。

每个学生可选课程的总数是给定的。

现在请你找出一种选课方案,使得你能得到学分最多,并且必须满足先修课优先的原则。

假定课程之间不存在时间上的冲突。

【文件输入】输入文件的第一行包括两个正整数M,N(中间用一个空格隔开),其中M表示待选课程总数(1<=M<=1000),N表示学生可以选的课程总数(1<=N<=M)。

接下来M行,每行代表一门课,课号依次为1,2,…,M。

每行有两个数(用一个空格隔开),第一个数为这门课的先修课的课号(若不存在先修课则该项为0),第二个数为这门课的学分。

学分不超过20的正整数。

【文件输出】输出文件只有一行为一个数,即实际所选课程的学分总数。

【样例输入】7 42 20 10 42 17 17 62 2【样例输出】13【思路点拨】本题与二叉苹果树的显著区别为输入数据是森林或一颗普通有序树,相对于二叉树来说,更复杂些。

对于此情况,可以把森林或普通有序树转换成二叉树,再进行DP设计。

下面分两个步骤来分析此问题:(1)转换树。

输入数据为一棵普通有序树或者森林,根据树的转换规则,把右子树转换成左子树的右儿子,或者右边的一棵树转换成左边树根的儿子。

cin>>n>>m;for(i=1;i<=n;i++){ cin>>k>>v;a[i].value=v;if(son[k]==0)a[k].left=i;else a[son[k]].right=i;son[k]=i;}(2)树上的动态规划创建。

以结点i为阶段,以选的课程数j为状态,以到达叶子结点为边界,以每个结点能取得的最高得分为决策,在整棵树上的决策构成一个决策序列。

用f[i][j]表示结点i为根的子树中取j门课程的最高得分,对树型结构分2种情况进行动态规划设计。

①由于是普通有序树或森林转换成的二叉树,所以需要对右子树进行特殊处理。

当只有右子树时,此时i结点不能选,只能选择i结点的右子树,即选择课程数为j。

所以此时的状态转移方程为:f[i][j]=f[i.r,j]。

②由于要选择左子树时,树根必须选择,所以可以把只有左子树和左右子树都有两种合并起来进行考虑,得到动态规划方程为:f[i][j]=max{f[i.l][k]+f[i.r][j-k-1]+a[i]}(0<=k<=j-1) 最后取①②两种情况中的最大值,即可得到在i结点处取j门课程的最大值。

时间复杂度:O(n2m)【例题4】数字转换【问题描述】如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和;如果对于某个y>x且y的约数和为x,那么x也可以变成y。

例如,4可以变为3,1可以变为7。

限定所有的数字变换在不超过n的正整数范围内进行,求不断进行数字变换且没有重复数字出现的最多变换步数。

【文件输入】输入一个正整数n【文件输出】输出不断进行数字变换且没有重复数字出现的最多变换步数。

【样例输入】7【样例输出】3【样例说明】一种方案为:4→3→1→7。

【数据范围】n<=50 000。

【思路点拨】先预处理出每个数的约数,然后很明显就是求树的最长链问题。

一棵有根树的最长链,可能出现如下图的两种情况:对于每个结点我们都要记录两个值:d1[i]表示以i为根的子树中,i到叶子节点的距离最大值;d2[i]表示以i为根的子树中,i到叶子节点的距离次大值;令j是i的儿子。

则:①若d1[j]+1>d1[i],则d2[i]=d1[i]; d1[i]=d1[j]+1;②否则,若d1[j]+1>d2[i],则d2[i]=d1[j]+1;最后扫描所有的结点,找最大的d1[i]+d2[i]的值。

【例题5】战略游戏【问题描述】Bob喜欢玩电脑游戏,特别是战略游戏。

但是他经常无法找到快速玩过游戏的办法。

现在他有个问题。

他要建立一个古城堡,城堡中的路形成一棵树。

他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能瞭望到所有的路。

注意:某个士兵在一个结点上时,与该结点相连的所有边将都可以被瞭望到。

请你编一程序,给定一树,帮Bob计算出他需要放置最少的士兵。

【文件输入】输入文件中数据表示一棵树,描述如下:第一行N,表示树中结点的数目。

相关文档
最新文档