树形动态规划(信息学竞赛)

合集下载

信息学竞赛骗分导论

信息学竞赛骗分导论
例也是2),于是心一恨写下了如下代码
writeln(2)
吃惊的是我的成绩,80分啊~~~(数据太弱了)
附标准算法:
用树型动态规划求解。定义f(n, m)为在n为根的子树中取m个节点的最小代价,则状态转
移方程为:
f(n, m)=min{f(n0, m0)+f(n1, m1)+f(n2, m2)+…+f(nk, mk)}
0 0 0
1 0 1
0 0 0
1 0 1
0
0
0
1
0
1
1
0
1
0
0
0
O x
y
0 0
0 0 0
0
1 1
1
0
1 1 1
1 1
0
0
0
0
0 0 0 0 0
0
0 0 0 0
0
1
0
1 1
2 2
短路径值,这样每次取出一个最小值的复杂度为O(1);由于此图中,每个点的度最多为4,
查找边的权值的复杂度为O(N),更新堆的复杂度为O(Vlog2V)。因而算法复杂度降为
O(V+NV+Vlog2V)。但由于V=10000*10000仍不能在时限中出解。
方法3:
此题的
数据规模有一些特性——虽然坐标系的范围巨大,但有效坐标(机器人的坐标,
宝藏的坐标和磁场顶点坐标)的个数却很小。上两个方法的主要复杂度都取决于V,也就是
坐标系中的点数。如果我们可以把坐标系的范围缩小,也就相当于把V缩小,就可以大大
如果先构图,复杂度为O(N ),再染色用宽搜求最短路复杂度为O(V),V所以总复杂
O x
y

信息学奥赛经典算法

信息学奥赛经典算法

信息学奥赛经典算法信息学奥赛是一项涉及算法和数据结构的比赛。

算法是指解决问题的具体步骤和方法,而数据结构是指存储和组织数据的方式。

在信息学奥赛中,掌握经典算法是非常重要的,可以提高解题的效率和成功的概率。

下面我将介绍一些经典的算法。

1.贪心算法(Greedy Algorithm)贪心算法是一种简单直观的算法思想,其基本策略是每一步都选择当前状态下的最优解,从而希望最终能够得到全局最优解。

贪心算法通常应用于问题的最优化,比如找出能够覆盖所有区域的最少选择。

然而,贪心算法并不是所有问题都适用,因为它可能会导致局部最优解,并不能得到全局最优解。

2.动态规划(Dynamic Programming)动态规划是一种通过将问题分解成更小的子问题来求解复杂问题的方法。

其主要思想是通过记录中间计算结果并保存起来,以避免重复计算。

动态规划常用于求解最优化问题,例如寻找最长递增子序列、最短路径等。

动态规划是一个非常重要的算法思想,也是信息学奥赛中常见的题型。

3.深度优先(Depth First Search,DFS)深度优先是一种常见的图遍历算法,其基本思想是从一个顶点开始,沿着路径向深度方向遍历图,直到无法继续前进,然后回溯到上一个节点。

DFS通常用于解决图的连通性问题,例如寻找图的强连通分量、欧拉回路等。

DFS的一个重要应用是解决迷宫问题。

4.广度优先(Breadth First Search,BFS)广度优先是一种图遍历算法,其基本思想是从一个顶点开始,按照广度方向遍历图,逐层往下遍历,直到找到目标节点或者遍历完整个图。

BFS通常用于解决最短路径问题,例如在一个迷宫中找到从起点到终点的最短路径。

5.分治算法(Divide and Conquer)分治算法是一种将问题分成更小的子问题并独立地求解它们的方法,然后通过合并子问题的结果来得到原始问题的解。

分治算法是一种递归的算法思想,通常在解决问题时能够显著提高效率。

信息学竞赛题目类型与解题思路分析

信息学竞赛题目类型与解题思路分析

信息学竞赛题目类型与解题思路分析信息学竞赛一直以来都是让同学们挑战自己智力和编程能力的平台。

在比赛中,不同类型的题目涉及到各种问题和解题思路。

本文将对信息学竞赛的题目类型进行分析,并探讨解题思路。

一、基础算法题在信息学竞赛中,基础算法题是最常见的一类题目。

这些题目主要考察编程能力,如数组、链表、树、图等数据结构的基本操作,以及排序、查找、递归等算法。

解决这类题目的关键在于熟练掌握基础算法和数据结构,并能够灵活运用。

二、动态规划题动态规划题目要求设计一个状态转移方程,通过状态的转移得到最优解。

这类题目常见于复杂的数学问题、字符串问题、背包问题等。

解决动态规划题目的关键在于找到合适的状态定义和状态转移方程,并采用递推的方式求解。

三、图论题图论是信息学竞赛中一个重要的分支,各种与图相关的问题都可能成为比赛题目。

这类题目要求学生熟悉图的基本概念和性质,如遍历、连通性、最短路径、最小生成树等。

解决图论题目的关键是选择合适的图算法,并能够熟练地实现。

四、搜索题搜索题是信息学竞赛中常见的一类题目,如深度优先搜索(DFS)、广度优先搜索(BFS)、回溯法等。

这类题目要求学生在给定的搜索空间中找到满足条件的解。

解决搜索题的关键在于合理地设计搜索状态和搜索顺序,并能够高效地剪枝。

五、数学题数学题在信息学竞赛中也是常见的一类题目。

这类题目常常考察学生对数学知识的理解和应用,如数论、组合数学、概率统计等。

解决数学题的关键在于运用数学思维和方法解决问题,同时结合编程的技巧进行求解。

六、综合题综合题是信息学竞赛中较为复杂的一类题目,常常要求学生综合并运用多种算法和技巧来解决问题。

这类题目通常会模拟实际生活中的复杂情境,考察学生的分析和解决问题的能力。

解决综合题的关键在于找到问题的关键点,分析问题的本质并设计相应的解决方案。

在面对不同类型的信息学竞赛题目时,同学们需要根据具体情况选择合适的解题思路。

在比赛前,建议同学们进行大量的练习和复习,熟悉各种算法和数据结构,培养良好的编程思维和解决问题的能力。

信息学竞赛中的策略与优化方法

信息学竞赛中的策略与优化方法

信息学竞赛中的策略与优化方法信息学竞赛是一项考验学生编程能力与算法思维的挑战。

在这个竞赛中,不仅要求选手具备扎实的计算机知识,还需要灵活运用策略与优化方法。

本文将探讨在信息学竞赛中常用的策略与优化方法,帮助读者提升竞赛表现。

一、贪心法贪心法是一种直观且容易实现的策略。

它总是做出当前看起来最优的选择,并希望最终的结果也是最优的。

在信息学竞赛中,常见的贪心法应用包括背包问题、区间选点等。

然而,贪心法并不能保证给出最优解,因此在使用时需要明确问题的性质,以确保贪心法是适用的。

二、动态规划动态规划是一种通过将问题划分为子问题,并保存子问题的解来求解复杂问题的方法。

在信息学竞赛中,动态规划经常被用来解决具有最优子结构性质的问题。

例如,最长公共子序列、最短路径等问题。

动态规划的关键在于建立递推关系式,并正确地设计状态转移方程。

三、搜索算法搜索算法是通过遍历问题的解空间来找到最优解的方法。

在信息学竞赛中,常见的搜索算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。

搜索算法的关键在于定义搜索的状态和搜索的顺序,通过剪枝等技巧来提高搜索效率。

此外,启发式搜索如A*算法也是一种常用的优化搜索方法。

四、数学方法数学方法在信息学竞赛中有着重要的地位。

通过合理地运用数学定理和技巧,能够大大简化问题的求解过程。

在信息学竞赛中常用的数学方法包括数论、组合数学和几何学等。

例如,在解决排列组合问题时,可以运用排列组合公式来简化计算。

五、数据结构数据结构是解决问题的基础。

恰当地选择和应用数据结构可以提高算法的效率。

在信息学竞赛中,常用的数据结构包括数组、链表、栈、队列、堆和树等。

选择合适的数据结构取决于问题的特点,如树状数组用于求解区间和问题,优先队列用于求解最短路径问题等。

六、模拟与优化模拟是指通过构建与问题相似的模型来求解问题的方法。

在信息学竞赛中,模拟方法常用于构建实际问题的抽象模型,并进行模拟实验。

通过优化模型和算法,可以得到更好的解。

信息学竞赛真题

信息学竞赛真题

< m)的连通图,必须删去G的()条边,才能使得G变成一棵树A.m - n+1 B. m-nC. m+n+1D.n- m+16.若某算法的计算时间表示为递推关系式:T(N)=2T(N/2)+NlogNT(1)=1则该算法的时间复杂度为( )。

A.O(N)B.O(NlogN)C.O(N log2N)D.O(N2)7.表达式a * (b + c) * d的后缀形式是()。

A. abcd*+*B. abc+*d*C. a*bc+*dD. b+c*a*d8.由四个不同的点构成的简单无向连通图的个数是( )A. 32B. 35C. 38D. 419.将7个名额分给4个不同的班级,允许有的班级没有名额,有( )种不同的分配方案A. 60B. 84C. 96D.12010.若f[0]=0, f[1]=1, f[n+1]=(f[n]+f[n-1])/2,则随着i 的增大,f[i]将接近与()。

A. 1/2B. 2/3D. 111.设A和B是两个长为n的有序数组,现在需要将A和B合并成一个排好序的数组,请问任何以元素比较作为基本运算的归并算法最坏情况下至少要做( )次比较。

A. n2B. nlognC. 2nD.2n-112.在n(n>=3)枚硬币中有一枚质量不合格的硬币(质量过轻或质量过重),如果只有一架天平可以用来称重且称重的硬币数没有限制,下面是找出这枚不合格的硬币的算法。

请把a-c三行代码补全到算法中。

a.A XUYb.A Zc.n |A|算法Coin(A,n)1.k n/32.将A中硬币分成X,Y,Z三个集合,使得|X|=|Y|=k, |Z|=n-2k3.if W(X)工W(Y) //W(X), W(Y分别为X或Y的重量4.then _______5.else _______6.__________7.if n>2 then goto 18.if n=2 then任取A中1枚硬币与拿走硬币比较,若不等,则它不合格;若相等,则A中剩下的硬币不合格9.if n=1 then A中硬币不合格正确的填空顺序是( )。

信息学竞赛学习计划

信息学竞赛学习计划

信息学竞赛学习计划导言信息学竞赛是一项旨在挑战学生计算机科学和信息技术技能的比赛。

它旨在培养学生的创造力、逻辑思维和问题解决能力。

参加信息学竞赛对学生来说是一项很好的机会,可以提升自己的技能并展示自己的才华。

本文将提出一份信息学竞赛学习计划,以帮助学生更好地准备竞赛。

一、确定学习目标首先,学生需要确定自己参加信息学竞赛的目标。

是为了获得奖项还是为了提高自己的技能?不同的目标会影响学习计划的制定。

如果是为了获奖,那么需要更加集中精力去准备基础知识和解题技巧;如果是为了提高技能,那么需要更多的时间去深入学习一些算法和数据结构知识。

二、学习基础知识信息学竞赛涉及的基础知识主要包括数据结构、算法、编程语言等。

学生可以通过阅读相关教材、参加培训班或者自学的方式来掌握这些知识。

在学习基础知识的过程中,学生需要不断练习,巩固所学知识,积累解题经验。

关于数据结构,学生可以学习常见的数据结构,如栈、队列、链表、树、图等,掌握它们的基本原理和常见操作。

同时,还需要学习一些高级数据结构,如并查集、线段树、树状数组等。

关于算法,学生可以学习常见的算法,如搜索、排序、贪心、动态规划等,掌握它们的原理和应用。

另外,还需要学习一些高级算法,如最短路算法、最小生成树算法、网络流算法等。

关于编程语言,学生需要熟练掌握至少一门编程语言,如C++、Java、Python等。

在选择编程语言时,可以参考相关竞赛的考试要求,选择一门最合适的编程语言。

三、解题技巧信息学竞赛的题目通常具有一定的难度和复杂性,因此解题技巧的掌握十分重要。

学生可以通过阅读题解、参加讨论、做练习题等方式来积累解题经验和提高解题能力。

在解题技巧方面,学生可以学习一些常用的解题方法和技巧,如分治法、递归、二分查找、双指针、扫描线等。

同时,还可以学习一些常见的套路和技巧,如模拟、贪心、动态规划等。

四、刷题训练刷题训练是信息学竞赛学习计划中非常重要的一部分。

通过刷题训练,学生可以巩固所学知识,积累解题经验,提高解题能力。

信息学竞赛 题目

信息学竞赛 题目

信息学竞赛题目
当提到信息学竞赛时,通常指的是计算机和算法相关的竞赛,如国际信息学奥林匹克竞赛(IOI)等。

以下是一些可能的信息学竞赛题目,包括算法设计、编程、数据结构等方面的内容:
最短路径问题:
设计一个算法,找到加权图中两点之间的最短路径。

可以考虑使用Dijkstra 算法或Floyd-Warshall算法。

排序算法的比较:
实现不同排序算法(如快速排序、归并排序、冒泡排序等),并比较它们在不同数据集上的性能。

动态规划问题:
解决一个动态规划问题,例如背包问题、最长公共子序列等。

图论问题:
给定一个图,设计算法检测是否存在环路,或者找到图中的最小生成树。

字符串处理:
编写一个程序,实现字符串的模式匹配或编辑距离计算。

并查集应用:
使用并查集解决一个集合合并或划分问题,例如朋友圈问题。

图的遍历:
设计一个算法,对图进行深度优先搜索(DFS)或广度优先搜索(BFS)。

动态规划背包问题:
给定一组物品的重量和价值,设计一个动态规划算法解决背包问题,最大化所装物品的总价值。

树的遍历与操作:
对一棵树进行先序、中序或后序遍历,并进行相应的操作,例如计算树的高度、直径等。

最大流问题:
设计一个算法解决最大流问题,例如Ford-Fulkerson算法或Edmonds-Karp 算法。

这些题目涉及了算法设计、数据结构、图论等多个方面,是信息学竞赛中常见的类型。

挑战性强,需要竞赛者具备深厚的计算机科学知识和解决问题的能力。

希望这些题目能够激发你在信息学竞赛中的学习兴趣。

信息学竞赛中的博弈论与动态规划

信息学竞赛中的博弈论与动态规划

信息学竞赛中的博弈论与动态规划在信息学竞赛中,博弈论和动态规划是两个重要的算法思想。

博弈论主要用于解决多个参与者之间相互影响的问题,而动态规划则用于解决最优化问题。

本文将探讨在信息学竞赛中,如何应用博弈论和动态规划来解决问题。

博弈论是一种研究决策制胜的数学理论,运用博弈论可以找到对抗对手的最佳策略。

在信息学竞赛中,有许多题目可以用博弈论的思想来解决。

例如,有两个选手同时做出决策,每个选手都希望自己的决策能够使自己的得分最大化。

这时候我们可以用博弈论的思想来求解最优策略。

动态规划是一种解决最优化问题的数学方法。

在信息学竞赛中,动态规划常用于求解最优路径、最长子序列等问题。

通过将问题划分为子问题,并利用子问题的最优解来求解原问题的最优解,可以大大提高算法的效率。

接下来,我们将通过一个具体的例子来介绍博弈论和动态规划在信息学竞赛中的应用。

假设有两个选手参加一个游戏,游戏规则如下:每个选手轮流抽取一个数,抽取的数可以是1、2或3,抽取的数可以累加到总分中。

最后,总分大于等于100的选手获胜。

我们需要找到一个最优的策略来决定每次抽取多少个数。

首先,我们使用动态规划的思想来解决这个问题。

我们定义一个dp 数组,dp[i]表示当总分为i时,当前选手是否能够获胜。

我们可以分析得出以下递推关系:dp[i] = !dp[i-1] || !dp[i-2] || !dp[i-3],其中||表示逻辑或运算。

根据这个递推关系,我们可以使用动态规划求解出dp数组的值。

然后,我们使用博弈论的思想来解决这个问题。

我们假设当前选手决策时,对手也会采取最优策略。

那么我们可以通过递归的方式来找到当前选手的最优策略。

具体来说,当前选手可以选择抽取1、2或3个数,那么对手会根据当前选手选择的数来改变总分。

我们可以通过递归调用来模拟每个选手的选择,并找到最优的策略。

通过以上两种方法,我们可以得到相同的结果,找到当前选手的最优策略。

这个例子展示了博弈论和动态规划在信息学竞赛中的应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
具体实现方法:使用数组模拟二叉树 L[x]:表示X的左儿子是谁!初值-1 R[x]:表示X的右儿子是谁!也就是X的兄弟,初值-1 last[x]:表示原树中x的当前一个子节点son1现在的位置,假如x的另外一个儿子 son2,要插入到二叉树中那么根据左儿子右兄弟的原则,既然son2跟son1为兄弟, 那么就放到son1所在位置的右子树即可!
代码: void build(int x,int y) //y的父亲结点为x { if(L[x]==-1) L[x] = y; else R[ last[x] ] = y; last[x]=y; }
1333: VIJOS-P1180 选课
状态F(x,y):表示节点x取y门课得最高学分 方程F(x,y)=max{F(R[x],k) , F(L[x],k-1) + a[x] + F(R[x],y-k) } k=0,1,..y F(L[x],k-1)+a[x] :表示左孩子选了k-1门课及包括课程x,共k门课 的最大学分。 F(R[x],y-k) 表示右孩子只能选y-k门课的最大得分。 分析出来了这么多,代码如何写才是关键,否则都是空中楼阁。 我们引入记忆化搜索的思想,即每深搜一步,把搜做到的结果 保存起来,当下次搜索到同样的位置时,直接使用! 记忆化搜索经典题目:1911滑雪 && 1257 Function
POJ 3342 Party at Hali-Bula
基本题意与2342相同,需要特别判断与会 名单是否唯一! 思考判定方法?是否有特例! 动规伴随着深搜,只需要考虑深搜时候的 局部情况即可判定全局情况。 即if(f[x][0]==f[x][1] && f[y][1]==f[y][0]) flag=0; 思考当n==2时,只能一个人与会,名单不 确定。但是使用上面的判断就不行了,需 要特判一下即可。
POJ 2342 Anniversary party
void work(int x) { f[x][0]=0 , f[x][1]=a[x]; //初始化 for(int y,i=head[x];i;i=next[i]) { y=to[i]; //y为x的子节点 work(y); //先处理完y才能动规x f[x][0]+=max(f[y][0],f[y][1]); f[x][1]+=f[y][0]; } }
树状动规
1333: VIJOS-P1180 选课
想要选修某个课程,那么它的先修课必须要被选择。 多叉树转二叉树动归。 首先大家先了解多叉树转二叉树。 原则:二叉树的结点x的左儿子为x的儿子,右儿子是x的 兄弟。即左儿子,右兄弟原则。
1 1 2 2 5 3 6 4ห้องสมุดไป่ตู้3
5
6
4
1333: 选课 (多叉树转二叉树)
POJ 3659 Cell Phone Network
结点的初值: f[x][0]=0; f[x][1]=0; f[x][2]=1; 如果是叶子结点呢? if(叶子) f[x][1]=1<<30;
最后的ans呢? ans=min( f[root][1] , f[root][2] )
POJ 2486 Apple Tree
N叉苹果树,结点上有苹果,问一共走k步,所能 吃到的苹果的最大值。 其中从A->B 算一步,返回B->A再算一步。 状态f[0][i][j]表示从i点走j步再回到i的最大值 状态f[1][i][j]表示从i点走j步不回到i的最大值 f[0][x][j+2]=max{f[0][x][j+2],f[0][y][k]+f[0][x][j-k]} f[1][x][j+2]=max{f[1][x][j+2],f[0][y][k]+f[1][x][j-k]} f[1][x][j+1]=max{f[1][x][j+1],f[1][y][k]+f[0][x][j-k]}
poj 3398 Perfect Service
同样是最小支配集问题。 我们使用另类的贪心方法来解决。 1、深搜遍历,把深搜的顺序记录下来。其实深搜的顺序 就是先根遍历的顺。 2、根据先跟遍历的顺序逆向处理,也就是相当于回溯的 过程。 3、如果一个结点x的覆盖状态mark[x]==0,并且如果其根 fa[x]的是否为server的状态为0,即set[fa[x]]==0,那么 ans++,set[fa[x]]=1; 4、不管set[fa[x]]是否为0,都要标记x,fa[x],fa[fa[x]]的状态 为覆盖。思考为什么?
1273: 加分二叉树
long long work(int x,int y) { if(x>y) return f[x][y]=1; if(f[x][y]!=-1) return f[x][y]; for(int k=0;k<=y-x;k++) if(f[x][y]<f[x+k][x+k]+work(x,x+k-1)*work(x+k+1,y) ) { f[x][y]=f[x+k][x+k]+work(x,x+k-1)*work(x+k+1,y); root[x][y]=x+k; //记录x到y区间的根,以便最后递归输出先根遍历。 } return f[x][y]; }
jdfz 1310:小胖守皇宫
本题也是最小支配集的题目,大家自行完 成。
POJ 2342 Anniversary party
题意:一个人不同他的直属上司一起参加 舞会,问参会人员的权值和的最大值。 显然每个人只有两种状态参加或者不参加 状态f[i][0]表示第i个人不参加,f[i][1]表示此 人参加,所的得到的子树的最大值。 f[i][1]+=f[j][0]; j是其下属的标号 f[i][0]+=max{ f[j][1],f[j][0] } 本题使用链式前向星存边,找出根root ans=max{ f[root][0], f[root][1]};
POJ 3659 Cell Phone Network
那么动态方程为:设y为x的子结点 f[x][0]+=min{ f[y][1] , f[y][2] } f[x][2]+=min{ f[y][0] , f[y][2] } f[x][1]的情况比较复杂,需要单独讨论了。 x的子节点y中是否存在y的自己覆盖小于y的子节点z的覆 盖,如果存在(f[y][2]<f[y][1]),那么这个y的分支就一定会被 选中,进而辐射到y的根节点x。此时f[x][1]=f[x][0]; 如果上述情况没有出现的话,只能选择一个最优的y,使 得y点放信号塔,来辐射到x。令temp=f[y][2]-f[y][1];那么 f[x][1]=f[x][0]+temp; 至此,动态转移方程就已经写完了,虽然有些复杂,但是 对于我们深入理解动态规划有很深的影响。
2140: 通向自由的钥匙
通向自由的钥匙被放n个房间里,这n个房 间由n-1条走廊连接。注意:这就是一棵树。 本题的动规的过程与上一题选课是一样的 唯一不同的是题目给出树的根为1,还有树 的联通性。 建二叉树树的过程是需要大家仔细思考的。
2140: 通向自由的钥匙
void build(int x) { for(int i=1;i<=n;i++) if(d[x][i]) { d[x][i]=d[i][x]=0; if( ls[x]==-1 ) ls[x]=i; else rs[ last[x] ]=i; last[x]=i; build(i); } }
poj 3398 Perfect Service
void dfs(int x){ deep[++num]=x; for(int y,i=head[x];i;i=next[i]){ y=to[i]; if(!v[y]){ v[y]=1; f[y]=x; dfs(y); } } } int greed(){ int re=0; for(int x,i=num;i>=1;i--){ x=deep[i]; if(!mark[x]){ if(!set[f[x]]) set[f[x]]=1,re++; mark[x]=1; mark[f[x]]=1;mark[f[f[x]]]=1; } } return re; }
POJ 2486 Apple Tree
void dfs(int x) { v[x]=1; for(int i=0;i<=step;i++) f[1][x][i]=f[0][x][i]=a[x]; int s=t[x].size(); for(int y,i=0;i<s;i++) { y=t[x][i]; if(!v[y]) { dfs(y); for(int j=step;j>=0;j--) for(int k=0;k<=j;k++) { f[0][x][j+2]=max(f[0][x][j+2] , f[0][y][k]+f[0][x][j-k] ); f[1][x][j+2]=max(f[1][x][j+2] , f[0][y][k]+f[1][x][j-k] ); f[1][x][j+1]=max(f[1][x][j+1] , f[1][y][k]+f[0][x][j-k] ); } } } }
POJ 3659 Cell Phone Network
题意:给出一棵树,树的每个节点都可以放信号塔,放信 号塔的节点可以覆盖到它周围的节点,问选择最少的建信 号塔的方案,使得树的所有节点都被覆盖。 这样的问题叫做:最小支配集问题,使用树形动归来处理。 考虑每个结点只有两种状态,放或者不放信号塔。其中如 果这个点不放信号塔,并且还需要被覆盖,又有两种情况: 一是其父亲结点放信号塔,二是其子节点中有一个放了信 号塔。 总结起来每个结点有三种情况: f[x][0]:x点的父亲结点放塔,以x为根的子树最少信号塔数 f[x][1]:x点的子节点放塔,以x为根的子树的最少信号塔数 f[x][2]:x点本身放信号塔,以x为根的子树最少信号塔数
相关文档
最新文档