您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 算法合集之《多角度思考创造性思维》
多角度思考创造性思维----运用树型动态规划解题的思路和方法探析江苏省南京外国语学校陈瑜希引入信息学竞赛中通常会出现这样的问题:给一棵树,要求以最少的代价(或取得最大收益)完成给定的操作有很多问题都是在树和最优性的基础上进行了扩充和加强,从而变成了棘手的问题这类问题通常规模较大,枚举算法的效率无法胜任,贪心算法不能得到最优解,因此要用动态规划解决引入在近几年信息学竞赛中,需要运用树型动态规划解决的问题频繁出现这些问题变化繁多,各类思想精华渗透其中,对选手分析问题的能力和解题创造性思维有着较高的要求,因此它在竞赛中占据了重要地位引入在此,我将分析近几年国际比赛、全国比赛中的树型动态规划问题,重点探讨几种树型动态规划问题的解法,并从这些问题的分析过程中,提炼出解决这类问题的思想方法——多角度思考,创造性思维。旨在论述解决问题的思维过程,而不仅仅是解题方法例题解析NOI03逃学的小孩IOI05河流NOI06网络收费POI04山洞问题描述n个伐木的村庄在0号结点有一个巨大的伐木场,木料被砍下后,顺着河流而被运到0号结点的伐木场为了减少运输木料的费用,再额外建造k个伐木场这些伐木场建造后,木料可以在运输过程中第一个碰到的新伐木场被处理。问题描述所有的河流都不会分叉,也就是说,每一个村子,顺流而下都只有一条路到0号结点。已知每个村子每年要产多少木料,求在哪些村子建设伐木场能获得最小的运费。N≤100K≤50问题抽象本题的题意很明确,即建立k个伐木厂,使得把所有木材运送到最近的祖先伐木厂的费用最小。由于题目给定的是一棵树,数据规模又比较大,很容易联想到树型动态规划。状态的确立首先必须有的是当前点及以当前点为根的子树中,一共建立了多少伐木厂,但是这显然是不够的,因为这个状态中没有任何与伐木厂位置相关的信息。因此我们还需要再加一维。加上有关伐木厂的位置的信息。)_,,(klefttofromf表示把以from为根的子树中建立kleft个伐木厂,把木材全部运送到最近的祖先伐木厂,所需要的费用,并且from有一个祖先伐木厂为to_。(注意到这里to_仅仅是from的祖先伐木厂,而未必是from的最近祖先伐木厂,这是为什么呢?)状态的转移状态转移分2种情况讨论:在from建立伐木厂不在from建立伐木厂状态的转移在from建立伐木厂:即分配kleft个伐木厂给from的子结点,使得费用最小。这分配的过程,也就相当于背包问题。h1是用来解背包问题的临时数组,son是from的儿子结点。),,(),1(1),(1jfromsonfjkihkih状态的转移不在from建立伐木厂:依然是分配kleft个伐木厂给from的子结点,使得费用最小。不过不同的是,权不是而是,因为from处不一定有伐木厂。h2是用来解背包问题的临时数组,son是from的儿子结点。),,(jfromsonf)_,,(),1(2),(2jtosonfjkihkih)_,,(jtosonf状态的转移最后)},_(2),,_(1min{)_,,(kleftnumsonhkleftnumsonhklefttofromf效率分析由于状态是3维的,而转移时需要枚举k、son、和j,看上去时间复杂度巨大。这是为什么?刚才的分析通过状态量和转移量相乘来分析效率,每一维都不到N。j的总数是n,son的总数也是n,所以虽然要枚举3个,但是总的运算量是一定的,时间复杂度为。)(3knO回顾本题的动态规划是多维的,要通过分析建立状态在兄弟结点之间要通过类似背包问题的思想进行第二次动态规划不是单纯的根据状态量和转移量分析时间复杂度,而是根据转移总量分析总量分析均摊分析例题解析NOI03逃学的小孩IOI05河流NOI06网络收费POI04山洞问题描述M=2N个点,构成一个满二叉树配对收费:对于每两个用户i,j(1≤ij≤2N)进行收费。用户可以自行选择两种付费方式A、B中的一种,收取的费用等于每两位不同用户配对产生费用之和。问题描述I付费方式J付费方式nA与nB大小关系付费系数k实际付费AAnAnB2k*Fi,jAB1BA1BB0AAnA≥nB0AB1BA1BB2问题描述对于用户i,如果他/她想改变付费方式(由A改为B或由B改为A),就必须支付Ci元给网络公司以修改档案。给定每个用户注册时所选择的付费方式以及Ci,试求这些用户应该如何选择自己的付费方式以使得总费用最少(更改付费方式费用+配对收费的费用)。N≤10问题转化配对收费的规则B较多时,AA收费系数为2AB收费系数为1BB收费系数为0其他情况反之设想:B较多时,在每一个A结点上有1个收费系数否则在每一个B结点上有1个收费系数单点收费状态的确立状态的设计应该与以i点为根的子树中A的个数有关,但仅仅这样是不够的,因为这些点是按A收费还是B收费还与以它每个祖先为根的子树中,A多还是B多有关。因此,这也是需要记录的。),,(kjif点i所管辖的所有用户中,有j个用户为A,在i的每个祖先u上,如果nanb,则标0,否则标1,这个数列可以用二进制表示,用k记录,在这种情况下的最少花费。状态的转移状态转移方程,其实就是将j个用户分配给i的左右子节点,并更改k}2),,(,1),,(min{),,(wskujrightfwskuleftfkjif状态的转移当i是叶节点时,可以根据k算出i与其它用户配对收费时所要交的费用,再根据i的初始情况加上AB的转化费用。效率分析粗略看来,空间复杂度是,时间复杂度是,对于本题的数据可以同时超空间和超时间了。不过这只是很粗略的分析,这些状态中有很多是取不到的。)(3mO)(4mO效率分析把根节点看做第0层,叶节点就是第n层,对于任意的第i层,A用户的个数最多只有,而祖先结点只有i个,即k最大只有,把的后两维合并成一维,空间复杂度其实只有。in2i2),,(kjif)(2mO效率分析再看时间复杂度,对于第i层,有个结点,每个节点的状态数是O(m)的,状态转移的复杂度是,所以每层的复杂度是。总共有n层,所以状态转移的时间复杂度是。i2)2(inO)(2mO)(2nmO回顾对收费规则进行转化对时间复杂度进行均摊分析第二点在树型动态规划中有着广泛的运用,本题通过粗略的分析会超时,但是仔细分析之后,发现时间复杂度比粗略的分析少了一维总结这2个例题从不同方面阐述了树型动态规划的解题方法,如:多维动态规划兄弟结点之间通过类似背包的思想进行第二次动态规划对复杂度的均摊分析这些方法在比赛中有着广泛的运用总结在此过程中,我认识到:面对陌生的问题,一方面要深入分析问题的属性,挖掘问题的本质,另一方面要多角度思考,抓住问题的特殊性,从而创造出正确的解题思路。不过,这类问题变化繁多,我只是提供了一些解题的方法和思路,抛砖引玉,重要的是平时的不断积累和总结
本文标题:算法合集之《多角度思考创造性思维》
链接地址:https://www.777doc.com/doc-2174352 .html