算法思想 树型动态规划和状态压缩动态规划
算法设计与分析讲义动态规划
动态规划算法的设计思路和技巧
设计思路
动态规划算法的设计思路是将原问题分解为子问题,通过对子问题的求解,得到 原问题的最优解。在设计和实现动态规划算法时,需要确定状态转移方程和边界 条件,并选择合适的状态变量和决策变量。
技巧
动态规划算法的技巧包括利用记忆化搜索、优化状态转移方程、预处理和缓存等 技巧来提高算法的效率和性能。此外,还应注意避免出现冗余计算和空间复杂度 过高的情况。
出最优的动态规划算法。
如何避免和解决动态规划中的状态重叠问题
避免状态重叠
在建立状态转移方程时,要注意避免状态重叠问题,即确保每 个状态只被计算一次,减少冗余计算。
使用记忆化搜索
通过使用记忆化搜索,将已经计算过的子问题的解存储起来, 避免重复计算,提高算法效率。
使用滚动数组
通过使用滚动数组,将子问题的解存储起来,避免重复计算, 提高算法效率,同时减少空间复杂度。
边界条件
边界条件是指问题在某个或某些边界状态下的最 优解。
通过设定合适的边界条件,可以限定搜索范围, 减少计算量。
在求解最优化问题时,通常从边界条件开始逐步 向内扩展,直到找到问题的最优解。
递归树
递归树是描述问题所有可能状 态的树形结构。
在动态规划算法中,通过构建 递归树,可以系统地枚举所有 可能的状态,并找到最优解所
背包问题算法及实现
总结词
背包问题是一类典型的动态规划问题,通 过将问题划分为多个子问题,并利用子问 题的解来构建原问题的解。
详细描述
背包问题是一类典型的优化问题,它涉及 到多个约束条件和多个选择方案。背包问 题可以通过动态规划算法求解,将问题划 分为多个子问题,并利用子问题的解来构 建原问题的解。常见的背包问题包括0/1背 包问题和分数背包问题等。
算法设计与分析中的动态规划
算法设计与分析中的动态规划动态规划是一种常用的算法设计与分析技术,通常用于求解具有重叠子问题和最优子结构性质的问题。
它的核心思想是将原问题分解为更小的子问题,并通过递推关系式将子问题的解整合为原问题的解。
在算法设计与分析领域,动态规划广泛应用于优化问题、最短路径问题、序列比对问题等。
一、动态规划的基本特征动态规划算法的正确性基于两个重要的特征:重叠子问题和最优子结构。
1. 重叠子问题重叠子问题是指在求解原问题时,子问题之间存在相互重叠的情况。
也就是说,子问题之间不是独立的,它们具有一定的重复性。
动态规划算法利用这个特征,通过保存已经求解过的子问题的解,避免重复计算,提高算法的效率。
2. 最优子结构最优子结构是指问题的最优解可以通过子问题的最优解推导得到。
也就是说,原问题的最优解可以通过一系列子问题的最优解进行构造。
这个特征是动态规划算法能够求解最优化问题的关键。
二、动态规划的基本步骤1. 确定状态动态规划算法需要明确问题的状态,即问题需要用哪些参数来描述。
状态一般与原问题和子问题的解相关。
2. 定义状态转移方程状态转移方程描述原问题与子问题之间的关系。
通过递推关系式,将原问题分解为更小的子问题,并将子问题的解整合为原问题的解。
3. 初始化根据问题的实际需求,对初始状态进行设定,并计算出初始状态的值。
这一步骤是递推关系式的起点。
4. 递推计算根据状态转移方程,通过递推关系式计算出子问题的解,并将子问题的解整合为原问题的解。
这一步骤通常采用迭代的方式进行。
5. 求解目标问题通过递推计算得到原问题的解,即为最优解或者问题的答案。
三、动态规划的应用动态规划算法在实际问题中具有广泛的应用。
下面以两个经典问题为例,介绍动态规划在实际中的应用。
1. 背包问题背包问题是一种经典的优化问题,主要包括0/1背包问题和完全背包问题。
其核心思想是在限定的背包容量下,选择一些具有最大价值的物品放入背包中。
2. 最长公共子序列问题最长公共子序列问题是指给定两个序列,求解它们的最长公共子序列的长度。
动态规划的分类解析
ans = max(ans, f[i]); printf(“%d\n“, ans);
最低通行费
一个商人穿过一个 N*N 的正方形的网格,去参与一个 特别重要的商务活动。他要从网格的左上角进,右下 角出。每穿越中间1个小方格,都要花费1个单位时间。 商人必需在(2N-1)个单位时间穿越出去。而在经过中 间的每个小方格时,都需要缴纳肯定的费用。
opt[i]=opt[k]+bri[i];
以上都是线性动规的一些例 题,它们的根底时间简单度 都是O(N2)
装箱问题
有一个箱子容量为maxv(正整数, maxv≤20230),同时有n件物品(0≤n≤30), 每件物品有一个体积vi(正整数) 。要求从 这n件物品中任取假设干件装入箱内,使 箱子的剩余空间最小。
这是线性动态规划的经典例题。
代码
for (int i = 1; i <= n; i++) scanf(“%d“, &a[i]);
for (int i = 1; i <= n; i++) { int mx = 1; for (int j = 1; j < i; j++) if (a[j] >= a[i]) mx = max(mx, f[j] + 1); f[i] = mx;
假设s1‥si(2≤i≤n)中插入j个乘号,其中s1‥sk 中插入了j-1个乘号,即乘式中的第j+1项为 sk+1‥si(j≤k≤i-1):
分析
设 ans[i][j]——长度为i的数串中插入j个乘
号的最大乘积〔整型数组〕。明显 ans[i][0]=s1..si对应的整型数组; ans[i][j]=max{ans[k][j-1]×sk+1..si}
2024年CSP NOIP 夏令营课程设计
2024 夏令营各营列表及说明(不分年级只分难度)务必选取本人匹配的营:a、请依照营别说明和对应课表选班;b、请进行学业水平测试选班;c、学业顾问推荐。
CSP-J 精英营
7 月 15-21 济南
系统学习过 CSP-J 知识体系,能用数据结构和算法写简单程序。但做题量不足、 难度不够、应用及变形能力 弱。
对算法知识进行梳理并通过补充大量经典例题增加难度。 课程内容覆盖 J 组的所有内容, 并还会涉及少量必要的 S 组的拓展内容。目标 200 分以上
4890
CSP-J 刷题实战 梳理营
7 月 23-30 济南
对 J 组知识已经相对熟悉, 知识储备完整, 但刷题量小、 刷题质量不高。利用知识储备分析、构造、解决问题能力不足、 实战能力弱
全模块。通过训练突破没有思路或有思路不会写的瓶颈,“快速审题+解题思路+代码实现+算法模型的构建 ”为主, 着力于分析能力、 构造能力、 解题能力的培养。目标具备 200 分以上能力
4890
S NOIP 刷题实 战梳理营
7 月 23-8 月 3 济南
对 S NOIP 知识已经相对熟悉, 知识储备完整但系统 性不强 。 缺少模块专项模拟和全真模拟 , 分析、构造、解决问题能力不足 , 实战能力弱
系统学习过 CSP-J 知识体系,能用数据结构和算法写简单 程序。但做题量不足、 难度不够、应用及变形能力弱。
对算法知识进行梳理并通过补充大量经典例题增加难度。 课程内容覆盖 J 组的所有内 容,并还会涉及少量必要的 S 组的拓展内容。目标 200 分以上
注:以上课程可能根据学生实际情况略有微调,以实际发放的课表为准。每课时 50 分钟。
算法分析与设计技巧:动态规划
算法分析与设计技巧:动态规划汇报人:日期:•引言•动态规划的基本原理•动态规划的经典问题与应用目录•动态规划的优化技巧与策略•动态规划的扩展与进阶•总结与展望引言01动态规划是一种求解最优化问题的算法思想,它通过将问题拆分为若干个子问题,并对子问题进行逐一求解,最终得到原问题的解。
定义动态规划对于解决重叠子问题和最优子结构的问题具有高效性,可以避免重复计算,提高算法效率。
同时,动态规划也是很多实际问题的基础,如资源分配、最短路径、背包问题等。
重要性动态规划的定义与重要性动态规划与其他算法的关系动态规划与分治法类似,都是通过将原问题拆分为子问题来求解。
但是,动态规划适用于子问题之间存在重叠的情况,而分治法适用于子问题相互独立的情况。
与贪心算法的关系贪心算法也是一种求解最优化问题的算法,但是贪心算法在每一步选择时都选择当前状态下的最优解,而不考虑全局最优。
动态规划则通过保存子问题的解,以达到全局最优。
以上只是动态规划的一部分应用领域,实际上动态规划的应用非常广泛,几乎涉及到计算机科学和工程领域的各个方面。
序列比对问题:在生物信息学中,用于比对两个或多个序列,找出它们之间的最优匹配。
背包问题:给定一组物品,每种物品都有自己的重量和价值,在限定的总重量内,如何选择物品才能使得物品的总价值最大。
资源分配问题:在有限的资源下,如何分配资源以达到最大效益。
最短路径问题:在图中寻找从起点到终点的最短路径。
动态规划的应用领域动态规划的基本原02理最优子结构是指问题的最优解可以由其子问题的最优解组合得到。
定义重要性例子最优子结构是动态规划的基础,只有当一个问题具有最优子结构性质时,才能用动态规划来解决。
例如,在背包问题中,问题的最优解就是由每个物品是否装入背包的子问题的最优解组合而来。
030201最优子结构边界条件是指子问题的最小情况,即子问题不能再继续分解时的解。
定义边界条件是动态规划的起点,它确定了递推的基础情况,使得状态转移方程得以进行。
【推选】状态压缩类型动态规划PPT实用
放置操作
• 对于每一行有w个位置,所以每一行都有0~2w-1种状态。 • 对于当前行的状态s,它是由前一行的状态s’转化过来的,
• 可以看出这题与动归4的“广场铺砖问题” 必须盖满,地板砖数量足够多,不能存在同时被多个板砖覆盖的部分。
Answer=∑f[n/2][j][s]。
完全类似。只不过这里多了一种砖而已。 S(L1,i) & S’(L2,i+2)
一般采用一个二进制数表示状态,有时也用三进制或四进制数等。 你需要计算用这些砖铺满地板共有多少种不同的方案。
• 对于上下两行:要能用某种类型的砖铺,必须该 砖所覆盖的区域为空。
#define bin(i) (1 << i)
/*1左移i位*/
#define emp(a,i) (!(a & bin(i))) /*判断a的i位是否位0*/
a= a | bin(i) | bin(i + 1); b=b a =a | bin(i) | bin(i + 1); b= b | bin(i) a =a | bin(i) | bin(i + 1); b= b | bin(i+1) a= a | bin(i) ; b= b | bin(i) a= a | bin(i) ;b= b | bin(i) | bin(i - 1) a= a | bin(i) ; b= b | bin(i) | bin(i + 1)
树形动态规划
引例、问题描述
给定一棵树,树的每个结点有一个权值, 要求从中选出一些不相邻的点,使选出 的结点权值和最大。
引例、问题分析
首先要给这棵树选一个根,明确了父子 关系才有动规的顺序。本题没有特殊要 求,只要任意选择一个点作根就可以了。
引例、确定状态
用f[i][0]表示不选i时,以i为根子树的最 大权值;用f[i][1]表示选择i时,以i为根 子树的最大值。
本题是以前一道省选题,当时要求输出 方案,请大家课后思考如何解决。
树型动规上的背包
有的资料在讲到树归时,说要用到多叉转二叉, 个人觉得并没有必要,那样不仅造成编程复杂 度增加,也会造成增加思维复杂度。
只要多写几道题目就会发现,如果把背包部分 单独写一个过程,它们的代码基本没有区别。 所以熟练之后,以后遇到此类问题,只要分析 到背包这一步,那就基本可以写程序了。
动态规划
最优子结构:一个最优化策略的子策略 总是最优的。
无后效性:当前决策与过去状态无关。
引言
因为树可以描述比较复杂的关系,这对 选手分析问题的能力有较高的要求,在 寻找最优子结构、组织状态时往往需要 创造性思维,而且树型动态规划对数学 要求不高,不涉及单调性优化等方面, 所以竞赛中往往将它作为侧重考察选手 分析思考能力的题型出现。
例二、问题分析
求在子树中的最远的三个点,方法很简 单。在儿子已经算好的情况下,父结点 只要保留其中最远点最远的三个儿子的 最远点即可。 子树外的最远点如何求?
例二、问题分析
把这棵树再遍历一遍,进行一次BFS, 深度小的先访问,深度大的后访问,就 保证了访问到某一个结点的时候,其父 亲结点已经被访问过了。此次遍历时, 对于点a,检查其父亲结点,只需求出到 其父亲结点的最远的,且不在以a为根的 子树中的那点即可 。
算法分析与设计技巧动态规划
总结词
图论中的最优化问题
算法
常见的最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法等
最短路径算法
总结词
详细描述
算法
排序与搜索算法
动态规划设计技巧
03
通过分析问题,选择合适的状态变量,使其能够全面反映问题状态。
确定状态
根据问题的时间顺序或逻辑关系,建立状态转移方程。
动态规划算法在实际应用中的优化
THANK YOU.
谢谢您的观看
通过将问题分解为多个子问题,建立状态转移方程,求解最优解
最优子结构
将大问题拆分为小问题,通过求解小问题的最优解来求解大问题的最优解
多重状态转移与最优子结构
状态压缩
将状态进行压缩,减少状态数量,降低空间复杂度
二进制优化
将状态用二进制数表示,利用二进制的特性进行优化
状态压缩与二进制优化
记忆化搜索
将已计算的结果存储起来,避免重复计算
确定最优子结构
通过选择最优的状态转移顺序,降低算法的时间复杂度。
选择最优状态转移顺序
优化状态转移顺序
利用公共子表达式
在计算过程中,将公共子表达式的结果存储起来,避免重复计算。
避免重复状态转移
在状态转移过程中,避免重复执行相同的子问题,提高算法效率。
避免重复计算与状态转移
动态规划高级技巧
04
多重状态转移
公式
设有一个0/1背包问题,其物品集合为 $w_1,w_2,\ldots,w_n$,每个物品的价值为 $v_1,v_2,\ldots,v_n$,背包的容量为 $W$,则求解该问题的最优解的算法即为背包问题的求解算法
详细描述
状态压缩动态规划浅谈
最优性原理、无后效性。 2、数据某几维规模比较小。
传统集合动态规划
例题一: 给定n个点的有向带权图,求一条经过每个
点一次的回路,并要求权和最小。 范围n<=15。
传统集合动态规划
显然对于某一个中间状态,影响它的最后 结果的仅仅是当前所在点以及之前已经经 过的点。而之前的路径行走情况与之后的 解无关。
性(染色法记录属于第几个连通块,最小表示)。 对于本题最多同时存在6个连通块的插头。
实现细节
转移:分类讨论插头方向。 1、当前格上方左方均有插头:只能将这两个连通
块连接。(1种) 2、当前格只有上方有插头:将这个插头向下向右
延伸。(2种) 3、当前格只有左方有插头:将这个插头向下向右
剪枝二:如果轮廓线上有一个插头p,它没 有被火柴点燃且没有其它的插头与它连通, 那么这个插头可以认为是“无效”插头。 这个状态可以剪枝。(必然存在不存在这 个“无效”插头的状态)
状态压缩动态规划中的剪枝
剪枝三:对于一个格子(i, j)的两个状态 (opt1,fired1)(opt2,fired2),如果第一个状 态的每一个存在的插头在第二个状态中不 仅存在而且都被点燃,那么第一个状态可 以剪枝。(一个状态必然不比第二个状态 优)
延伸。(2种) 4、当前格周围无插头:若当前格为障碍物,则无
插头,否则插入一个折线形插头。
实现细节
合并连通块: 对于第一种情况,需要合并连通块。若不加限制,
则会计算出包含多条回路的情况。 限制:和并连通块时,若两个插头属于同一个连
通块,则当且仅当在最后一个有效格子中可以将 这两个插头连接。 最后统计:计算到最后一个有效格子时,需要统 计答案。此时,要保证当前状态没有剩余的插头。
《树型动态规划》课件
要点二
详细描述
通过动态规划的方式,定义状态转移方程,根据当前状态 和下一个状态的关系,逐步计算出最长公共子序列的长度 。
区间dp问题的实例分析
总结词
求解区间dp问题的最优解
详细描述
将区间dp问题转化为子区间dp问题,通过 动态规划的方式,定义状态转移方程,逐步 计算出每个子区间的最优解,最终得到整个
状态压缩
通过将多个状态合并为一个状态,减少动态规划的状态数,提高 算法效率。
自底向上计算
从叶子节点开始计算,逐步向根节点推进,直到解决问题。
02
树型动态规移方程是树型动态规划的核心,它描述了从当前状态 转移到下一状态的过程。通过状态转移方程,我们可以计算 出每个节点的最小成本或最优解。
边界条件
边界条件是指问题在某些特定情况下的限制条件。在树型 动态规划中,边界条件通常用于确定问题的起始和终止状 态。
边界条件有助于缩小问题的解空间,提高计算效率。在树 型动态规划中,我们需要根据问题的特性,合理设置边界 条件,以简化计算过程并获得正确的解。
03
树型动态规划的常见问题
区间dp问题
算法改进与优化
针对现有算法的瓶颈和缺陷,进行改进和优化, 以提高算法的效率和适用范围。
理论分析与证明
深入分析树型动态规划算法的理论基础和性质, 如时间复杂度、空间复杂度、最优解的性质等, 为算法设计和改进提供理论支持。
感谢观看
THANKS
总结词
区间dp问题是指给定一个区间,求 出该区间内所有子区间的最大值或最 小值的问题。
详细描述
区间dp问题可以通过动态规划来解决 ,将问题分解为多个子问题,并利用 状态转移方程来求解。常见的区间dp 问题包括区间求和、区间查找等。
经典树型DP状态压缩DP入门
TSP
最后的结果是: min( dp[( 1<<n ) – 1][j] ) ( 0 <= j < n ); 技巧:利用2进制,使得一个整数表示一个点 集,这样集合的操作可以用位运算来实现。 例如从集合i中去掉点j: k = i & ( ~( 1 << j ) ) 或者 k = i - ( 1 << j )
习题
树型动态规划 nkoj 1791 Party at Hali-Bula nkoj 1678 Strategic game nkoj 1794 Bribing FIPA (需要2重dp) poj 1946 Rebuilding Roads (需要2重dp) 状态压缩动态规划 nkoj 1068 Islands and Bridges poj 3229 The Best Travel Design poj 1038 Bugs Integrated, Inc.
经典入门
树型动态规划和状态压缩动态规划不能允许上传同样的,所以我在 这里改改 财富值为零,请随便下载
树型动态规划
什么是树型动态规划: 树本身就是一个递归的结构,所以在树上进 行动态规划或者递推是在合适不过的事情。 必要条件:子树之间不可以相互干扰,如果 本来是相互干扰的,那么我们必须添加变量 使得他们不相互干扰。
TSP
所以一个整数i就表示了一个点集; 整数i可以表示一个点集,也可以表示是 第i个点。 状态表示:dp[i][j]表示经过点集i中的点 恰好一次,不经过其它的点,并且以j点 为终点的路径,权值和的最小值,如果这 个状态不存在,就是无穷大。
TSP
状态转移: 单点集:状态存在dp[i][j] = 0;否则无穷 大。非单点集: 状态存在 dp[i][j] = min(dp[k][s] + w[s][j]) k表示i集合中去掉了j点的集合,s遍历集 合k中的点并且dp[k][s]状态存在, 点s到 点j有边存在,w[s][j]表示边的权值。 状态不存在 dp[i][j]为无穷大。
几个经典的动态规划算法
对于这个问题,一开始确实有点不太好入手。一堆的物品,每一个都有一定的质量和价值,我们能够装入的总重量有限制,该怎么来装使 得价值最大呢?对于这n个物品,每个物品我们可能会选,也可能不选,那么我们总共就可能有2^n种组合选择方式。如果我们采用这种办法 来硬算的话,则整体的时间复杂度就达到指数级别的,肯定不可行。 现在我们换一种思路。既然每一种物品都有价格和重量,我们优先挑选那些单位价格最高的是否可行呢?比如在下图中,我们有3种物品, 他们的重量和价格分别是10, 20, 30 kg和60, 100, 120
9.
{
10.
sum += A[j];
11.
Hale Waihona Puke MaxSum = max(MaxSum,sum);
12.
13.
}
14. }
15. return MaxSum;
16. }
穷举法:
[cpp]
1. int MaxSubStringSum(int *A,int n) 2. { 3. int MaxSum = A[0]; 4. int sum = 0; 5. for (int i = 0;i < n;i++) 6. {
7.
sum = 0;
8.
for (int j = i;j < n;j++)
二、动态规划实例 1、0-1背包问题 问题描述
假设我们有n件物品,分别编号为1,2,…n。其中编号为i的物品价值Vi,它的重量为Wi。为了简化问题,假设价值和重量都是整数。现在假 设我们有一个背包,它能够承载的重量是W。现在,我们希望王背包里装这些物品,使得包里装的物品价值最大化,那么我们该如何选择装 的物品?问题结构如下图所示:
DP算法总结
1. 资源问题1-----机器分配问题f[i,j]:=max(f[i-1,k]+w[i,j-k]);2. 资源问题2------01背包问题f[i,j]:=max(f[i-1,j-v[i]]+w[i],f[i-1,j]);3. 线性动态规划1-----朴素最长非降子序列f[i]:=max{f[j]+1}4. 剖分问题1-----石子合并f[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]);5. 剖分问题2-----多边形剖分f[i,j]:=min(f[i,k]+f[k,j]+a[k]*a[j]*a[i]);6. 剖分问题3------乘积最大f[i,j]:=max(f[k,j-1]*mult[k,i]);7. 资源问题3-----系统可靠性(完全背包)f[i,j]:=max{f[i-1,j-c[i]*k]*P[I,x]};8. 贪心的动态规划1-----快餐问题f[i,j,k]:=max{f[i-1,j',k']+(T[i]-(j-j')*p1-(k-k')*p2) div p3};9. 贪心的动态规划2-----过河f[i]=min{{f(i-k)} (not stone[i]){f(i-k)}+1} (stone[i]); +贪心压缩状态10. 剖分问题4-----多边形-讨论的动态规划F[i,j]:=max{正正f[I,k]*f[k+1,j];负负g[I,k]*f[k+1,j];正负g[I,k]*f[k+1,j];负正f[I,k]*g[k+1,j];} g为min11. 树型动态规划1-----加分二叉树(从两侧到根结点模型)F[i,j]:=max{f[i,k-1]*f[k+1,j]+c[k]};12. 树型动态规划2-----选课(多叉树转二叉树,自顶向下模型)f[i,j]表示以i为根节点选j门功课得到的最大学分f[i,j]:=max{f[t[i].l,k]+f[t[i].r,j-k-1]+c[i]};13. 计数问题1-----砝码称重f[f[0]+1]=f[j]+k*w[j];(1<=i<=n; 1<=j<=f[0]; 1<=k<=a[i];)14. 递推天地1------核电站问题f[-1]:=1; f[0]:=1;f[i]:=2*f[i-1]-f[i-1-m];15. 递推天地2------数的划分f[i,j]:=f[i-j,j]+f[i-1,j-1];16. 最大子矩阵1-----一最大01子矩阵f[i,j]:=min(f[i-1,j],v[i,j-1],v[i-1,j-1])+1;ans:=maxvalue(f);17. 判定性问题1-----能否被4整除g[1,0]:=true; g[1,1]:=false; g[1,2]:=false; g[1,3]:=false; g[i,j]:=g[i-1,k] and ((k+a[i,p]) mod 4 = j)18. 判定性问题2-----能否被k整除f[i,j±n[i] mod k]:=f[i-1,j]; -k<=j<=k; 1<=i<=n20. 线型动态规划2-----方块消除游戏f[i,i-1,0]:=0f[i,j,k]:=max{f[i,j-1,0]+sqr(len(j)+k), //dof[i,p,k+len[j]]+f[p+1,j-1,0] //not do}; ans:=f[1,m,0];21. 线型动态规划3-----最长公共子串,LCS问题f[i,j]=0 (i=0)&(j=0);f[i-1,j-1]+1 (i>0,j>0,x[i]=y[j]);max{f[i,j-1]+f[i-1,j]}} (i>0,j>0,x[i]<>y[j]);22. 最大子矩阵2-----最大带权01子矩阵O(n^2*m)枚举行的起始,压缩进数列,求最大字段和,遇0则清零23. 资源问题4-----装箱问题(判定性01背包)f[j]:=(f[j] or f[j-v[i]]);24. 数字三角形1-----朴素の数字三角形f[i,j]:=max(f[i+1,j]+a[I,j],f[i+1,j+1]+a[i,j]);25. 数字三角形2-----晴天小猪历险记之Hill同一阶段上暴力动态规划f[i,j]:=min(f[i,j-1],f[i,j+1],f[i-1,j],f[i-1,j-1])+a[i,j];26. 双向动态规划1数字三角形3-----小胖办证f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j],f[i,j+1]+a[i,j]);27. 数字三角形4-----过河卒//边界初始化f[i,j]:=f[i-1,j]+f[i,j-1];28. 数字三角形5-----朴素的打砖块f[i,j,k]:=max(f[i-1,j-k,p]+sum[i,k],f[i,j,k]);29. 数字三角形6-----优化的打砖块f[i,j,k]:=max{g[i-1,j-k,k-1]+sum[i,k]};30. 线性动态规划3-----打鼹鼠’f[i]:=f[j]+1;(abs(x[i]-x[j])+abs(y[i]-y[j])<=t[i]-t[j]);31. 树形动态规划3-----贪吃的九头龙f[i,j,k]:=min(f[x1,j1,1]+f[x2,j-j1-1,k]+d[k,1]*cost[i,fa[i]]] {Small Head}, f[x1,j1,0]+f[x2,j-j1,k]+d[k,0]*cost[i,fa[i]] {Big Head});f[0,0,k]:=0; f[0,j,k]:=max(j>0)d[i,j]:=1 if (i=1) and (j=1)1 if (i=0) and (j=0) and (M=2)0 else32. 状态压缩动态规划1-----炮兵阵地Max(f[Q*(r+1)+k],g[j]+num[k]);If (map[i] and plan[k]=0) and((plan[P] or plan[q]) and plan[k]=0);33. 递推天地3-----情书抄写员f[i]:=f[i-1]+k*f[i-2];34. 递推天地4-----错位排列f[i]:=(i-1)(f[i-2]+f[i-1]);f[n]:=n*f[n-1]+(-1)^(n-2);35. 递推天地5-----直线分平面最大区域数f[n]:=f[n-1]+n:=n*(n+1) div 2 + 1;36. 递推天地6-----折线分平面最大区域数f[n]:=(n-1)(2*n-1)+2*n;37. 递推天地7-----封闭曲线分平面最大区域数f[n]:=f[n-1]+2*(n-1);:=sqr(n)-n+2;38 递推天地8-----凸多边形分三角形方法数f[n]:=C(2*n-2,n-1) div n;对于k边形f[k]:=C(2*k-4,k-2) div (k-1); //(k>=3)39 递推天地9-----Catalan数列一般形式1,1,2,5,14,42,132f[n]:=C(2k,k) div (k+1);40 递推天地10-----彩灯布置排列组合中的环形染色问题f[n]:=f[n-1]*(m-2)+f[n-2]*(m-1); (f[1]:=m; f[2]:=m(m-1);41 线性动态规划4-----找数线性扫描sum:=f[i]+g[j];(if sum=Aim then getout; if sum<Aim then inc(i) else inc(j);)42 线性动态规划5-----隐形的翅膀min:=min{abs(w[i]/w[j]-gold)};if w[i]/w[j]<gold then inc(i) else inc(j);43 剖分问题5-----最大奖励f[i]:=max(f[i],f[j]+(sum[j]-sum[i])*i-t;44 最短路1-----Floydf[i,j]:=max(f[i,j],f[i,k]+f[k,j]);ans[q[i,j,k]]:=ans[q[i,j,k]]+s[i,q[i,j,k]]*s[q[i,j,k],j]/s[i,j];45 剖分问题6-----小H的小屋F[l,m,n]:=f[l-x,m-1,n-k]+S(x,k);46 计数问题2-----陨石的秘密(排列组合中的计数问题)Ans[l1,l2,l3,D]:=f[l1+1,l2,l3,D+1]-f[l1+1,l2,l3,D];F[l1,l2,l3,D]:=Sigma(f[o,p,q,d-1]*f[l1-o,l2-p,l3-q,d]);47 线性动态规划------合唱队形两次F[i]:=max{f[j]+1}+枚举中央结点48 资源问题------明明的预算方案:加花的动态规划f[i,j]:=max(f[i,j],f[l,j-v[i]-v[fb[i]]-v[fa[i]]]+v[i]*p[i]+v[fb[i]]*p[fb[i]]+v[fa[i]]*p[fa[i]]);49 资源问题-----化工场装箱员50 树形动态规划-----聚会的快乐f[i,2]:=max(f[i,0],f[i,1]);f[i,1]:=sigma(f[t[i]^.son,0]);f[i,0]:=sigma(f[t[i]^.son,3]);51 树形动态规划-----皇宫看守f[i,2]:=max(f[i,0],f[i,1]);f[i,1]:=sigma(f[t[i]^.son,0]);f[i,0]:=sigma(f[t[i]^.son,2]);52 递推天地-----盒子与球f[i,1]:=1;f[i,j]:=j*(f[i-1,j-1]+f[i-1,j]);53 双重动态规划-----有限的基因序列f[i]:=min{f[j]+1}g[c,i,j]:=(g[a,i,j] and g[b,i,j]) or (g[c,i,j]);54 最大子矩阵问题-----居住空间f[i,j,k]:=min(min(min(f[i-1,j,k],f[i,j-1,k]),min(f[i,j,k-1],f[i-1,j-1,k])),min(min(f[i-1,j,k-1],f[i,j-1,k-1] ),f[i-1,j-1,k-1]))+1;55 线性动态规划------日程安排f[i]:=max{f[j]}+P[I]; (e[j]<s[i])56 递推天地------组合数C[i,j]:=C[i-1,j]+C[i-1,j-1];C[i,0]:=157 树形动态规划-----有向树k中值问题F[I,r,k]:=max{max{f[l[i],I,j]+f[r[i],I,k-j-1]},f[f[l[i],r,j]+f[r[i],r,k-j]+w[I,r]]};58 树形动态规划-----CTSC 2001选课F[I,j]:=w[i](if i∈P)+f[l[i],k]+f[r[i],m-k](0≤k≤m)(if l[i]<>0);59 线性动态规划-----多重历史f[i,j]:=sigma{f[i-k,j-1]}(if checked);60 背包问题(+-1背包问题+回溯)-----CEOI1998 Substractf[i,j]:=f[i-1,j-a[i]] or f[i-1,j+a[i]];61 线性动态规划(字符串)-----NOI 2000 古城之谜f[i,1,1]:=min{f[i+length(s),2,1], f[i+length(s),1,1]+1};f[i,1,2]:=min{f[i+length(s),1,2]+words[s],f[i+length(s),1,2]+words[s]};62 线性动态规划-----最少单词个数f[i,j]:=max{f[i,j],f[u-1,j-1]+l};63 线型动态规划-----APIO2007 数据备份状态压缩+剪掉每个阶段j前j*2个状态和j*2+200后的状态贪心动态规划f[i]:=min(g[i-2]+s[i],f[i-1]);64 树形动态规划-----APIO2007 风铃f[i]:=f[l]+f[r]+{1 (if c[l]<c[r])};g[i]:=1(d[l]<>d[r]) 0(d[l]=d[r]);g[l]=g[r]=1 then Halt;65 地图动态规划-----NOI 2005 adv19910F[t,i,j]:=max{f[t-1,i-dx[d[[t]],j-dy[d[k]]]+1],f[t-1,i,j];66 地图动态规划-----优化的NOI 2005 adv19910F[k,i,j]:=max{f[k-1,i,p]+1} j-b[k]<=p<=j;67 目标动态规划-----CEOI98 subtraF[I,j]:=f[I-1,j+a[i]] or f[i-1,j-a[i]];68 目标动态规划----- Vijos 1037搭建双塔问题F[value,delta]:=g[value+a[i],delta+a[i]] or g[value,delta-a[i]];69 树形动态规划-----有线电视网f[i,p]:=max(f[i,p],f[i,p-q]+f[j,q]-map[i,j]);leaves[i]>=p>=l, 1<=q<=p;70 地图动态规划-----vijos某题F[i,j]:=min(f[i-1,j-1],f[i,j-1],f[i-1,j]);71 最大子矩阵问题-----最大字段和问题f[i]:=max(f[i-1]+b[i],b[i]); f[1]:=b[1];72 最大子矩阵问题-----最大子立方体问题枚举一组边i的起始,压缩进矩阵B[I,j]+=a[x,I,j];枚举另外一组边的其实,做最大子矩阵73 括号序列-----线型动态规划f[i,j]:=min(f[i,j],f[i+1,j-1] (s[i]s[j]=”()”or(”[]”)),f[i+1,j+1]+1 (s[j]=”(”or”[” ) , f[i,j-1]+1(s[j]=”)”or”]”);74 棋盘切割-----线型动态规划f[k,x1,y1,x2,y2]=min{min{f[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2],f[k-1,a+1,y1,x2,y2]+s[x1,y1,a,y2]};75 概率动态规划-----聪聪和可可(NOI2005)x:=p[p[i,j],j];f[I,j]:=(f[x,b[j,k]]+f[x,j])/(l[j]+1)+1;f[I,i]=0;f[x,j]=1;76 概率动态规划-----血缘关系F[A, B]=(f[A0, B]+P[A1, B])/2;f[i,i]=1;f[i,j]=0;(i,j无相同基因)77 线性动态规划-----决斗F[i,j]=(f[i,j] and f[k,j]) and (e[i,k] or e[j,k]); (i<k<j)78 线性动态规划-----舞蹈家F[x,y,k]=min(f[a[k],y,k+1]+w[x,a[k]],f[x,a[k],k+1]+w[y,a[k]]);79 线性动态规划-----积木游戏F[i,a,b,k]=max(f[a+1,b,k],f[i+1,a+1,a+1,k],f[i,a+1,a+1,k]);80 树形动态规划(双次记录)-----NOI2003 逃学的小孩朴素的话枚举节点i和离其最远的两个节点j,k O(n^2)每个节点记录最大的两个值,并记录这最大值分别是从哪个相邻节点传过来的。
动态规划动态转移方程大全
1. 资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k])2. 资源问题2------01背包问题F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]);3. 线性动态规划1-----朴素最长非降子序列F:=max{f[j]+1}4. 剖分问题1-----石子合并F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]);5. 剖分问题2-----多边形剖分F[I,j]:=min(f[i,k]+f[k,j]+a[k]*a[j]*a);6. 剖分问题3------乘积最大f[i,j]:=max(f[k,j-1]*mult[k,i]);7. 资源问题3-----系统可靠性(完全背包)F[i,j]:=max{f[i-1,j-c*k]*P[I,x]}8. 贪心的动态规划1-----快餐问题F[i,j,k]:=max{f[i-1,j',k']+(T-(j-j')*p1-(k-k')*p2) div p3}9. 贪心的动态规划2-----过河f=min{{f(i-k)} (not stone){f(i-k)}+1} (stone); +贪心压缩状态10. 剖分问题4-----多边形-讨论的动态规划F[i,j]:=max{正正f[I,k]*f[k+1,j];负负g[I,k]*f[k+1,j];正负g[I,k]*f[k+1,j];负正f[I,k]*g[k+1,j];} g为min11. 树型动态规划1-----加分二叉树(从两侧到根结点模型)F[I,j]:=max{f[I,k-1]*f[k+1,j]+c[k]}12. 树型动态规划2-----选课(多叉树转二叉树,自顶向下模型)F[I,j]表示以i为根节点选j门功课得到的最大学分f[i,j]:=max{f[t.l,k]+f[t.r,j-k-1]+c}13. 计数问题1-----砝码称重f[f[0]+1]=f[j]+k*w[j];(1<=i<=n; 1<=j<=f[0]; 1<=k<=a;)14. 递推天地1------核电站问题f[-1]:=1; f[0]:=1;f:=2*f[i-1]-f[i-1-m]15. 递推天地2------数的划分f[i,j]:=f[i-j,j]+f[i-1,j-1];16. 最大子矩阵1-----一最大01子矩阵f[i,j]:=min(f[i-1,j],v[i,j-1],v[i-1,j-1])+1;ans:=maxvalue(f);17. 判定性问题1-----能否被4整除g[1,0]:=true; g[1,1]:=false; g[1,2]:=false; g[1,3]:=false;g[i,j]:=g[i-1,k] and ((k+a[i,p]) mod 4 = j)18. 判定性问题2-----能否被k整除f[I,j±n mod k]:=f[i-1,j]; -k<=j<=k; 1<=i<=n20. 线型动态规划2-----方块消除游戏f[i,i-1,0]:=0f[i,j,k]:=max{f[i,j-1,0]+sqr(len(j)+k),f[i,p,k+len[j]]+f[p+1,j-1,0]}ans:=f[1,m,0]21. 线型动态规划3-----最长公共子串,LCS问题f[i,j]={0(i=0)&(j=0);f[i-1,j-1]+1 (i>0,j>0,x=y[j]);max{f[i,j-1]+f[i-1,j]}} (i>0,j>0,x<>y[j]);22. 最大子矩阵2-----最大带权01子矩阵O(n^2*m)枚举行的起始,压缩进数列,求最大字段和,遇0则清零23. 资源问题4-----装箱问题(判定性01背包)f[j]:=(f[j] or f[j-v]);24. 数字三角形1-----朴素の数字三角形f[i,j]:=max(f[i+1,j]+a[I,j],f[i+1,j+1]+a[i,j]);25. 数字三角形2-----晴天小猪历险记之Hill同一阶段上暴力动态规划if[i,j]:=min(f[i,j-1],f[I,j+1],f[i-1,j],f[i-1,j-1])+a[i,j]26. 双向动态规划1数字三角形3-----小胖办证f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j],f[i,j+1]+a[i,j])27. 数字三角形4-----过河卒//边界初始化f[i,j]:=f[i-1,j]+f[i,j-1];28. 数字三角形5-----朴素的打砖块f[i,j,k]:=max(f[i-1,j-k,p]+sum[i,k],f[i,j,k]);29. 数字三角形6-----优化的打砖块f[I,j,k]:=max{g[i-1,j-k,k-1]+sum[I,k]}30. 线性动态规划3-----打鼹鼠’f:=f[j]+1;(abs(x-x[j])+abs(y-y[j])<=t-t[j])31. 树形动态规划3-----贪吃的九头龙32. 状态压缩动态规划1-----炮兵阵地Max(f[Q*(r+1)+k],g[j]+num[k])If (map and plan[k]=0) and((plan[P] or plan[q]) and plan[k]=0)33. 递推天地3-----情书抄写员f:=f[i-1]+k*f[i-2]34. 递推天地4-----错位排列f:=(i-1)(f[i-2]+f[i-1]);f[n]:=n*f[n-1]+(-1)^(n-2);35. 递推天地5-----直线分平面最大区域数f[n]:=f[n-1]+n:=n*(n+1) div 2 + 1;36. 递推天地6-----折线分平面最大区域数f[n]:=(n-1)(2*n-1)+2*n;37. 递推天地7-----封闭曲线分平面最大区域数f[n]:=f[n-1]+2*(n-1):=sqr(n)-n+2;38 递推天地8-----凸多边形分三角形方法数f[n]:=C(2*n-2,n-1) div n;对于k边形f[k]:=C(2*k-4,k-2) div (k-1); //(k>=3)39 递推天地9-----Catalan数列一般形式1,1,2,5,14,42,132f[n]:=C(2k,k) div (k+1);40 递推天地10-----彩灯布置排列组合中的环形染色问题f[n]:=f[n-1]*(m-2)+f[n-2]*(m-1); (f[1]:=m; f[2]:=m(m-1);41 线性动态规划4-----找数线性扫描sum:=f+g[j];(if sum=Aim then getout; if sum<Aim then inc(i) else inc(j);)42 线性动态规划5-----隐形的翅膀min:=min{abs(w/w[j]-gold)};if w/w[j]<gold then inc(i) else inc(j);43 剖分问题5-----最大奖励f:=max(f,f[j]+(sum[j]-sum)*i-t44 最短路1-----Floydf[i,j]:=max(f[i,j],f[i,k]+f[k,j]);ans[q[i,j,k]]:=ans[q[i,j,k]]+s[i,q[i,j,k]]*s[q[i,j,k],j]/s[i,j];45 剖分问题6-----小H的小屋F[l,m,n]:=f[l-x,m-1,n-k]+S(x,k);46 计数问题2-----陨石的秘密(排列组合中的计数问题)Ans[l1,l2,l3,D]:=f[l1+1,l2,l3,D+1]-f[l1+1,l2,l3,D];F[l1,l2,l3,D]:=Sigma(f[o,p,q,d-1]*f[l1-o,l2-p,l3-q,d]);47 线性动态规划------合唱队形两次F:=max{f[j]+1}+枚举中央结点48 资源问题------明明的预算方案:加花的动态规划f[i,j]:=max(f[i,j],f[l,j-v-v[fb]-v[fa]]+v*p+v[fb]*p[fb]+v[fa]*p[fa]);49 资源问题-----化工场装箱员50 树形动态规划-----聚会的快乐f[i,2]:=max(f[i,0],f[i,1]);f[i,1]:=sigma(f[t^.son,0]);f[i,0]:=sigma(f[t^.son,3]);51 树形动态规划-----皇宫看守f[i,2]:=max(f[i,0],f[i,1]);f[i,1]:=sigma(f[t^.son,0]);f[i,0]:=sigma(f[t^.son,3]);52 递推天地-----盒子与球f[i,1]:=1;f[i,j]:=j*(f[i-1,j-1]+f[i-1,j]);53 双重动态规划-----有限的基因序列f:=min{f[j]+1}g[c,i,j]:=(g[a,i,j] and g[b,i,j]) or (g[c,i,j])54 最大子矩阵问题-----居住空间f[i,j,k]:=min(min(min(f[i-1,j,k],f[i,j-1,k]),min(f[i,j,k-1],f[i-1,j-1,k])),min(min(f[i-1,j,k-1],f[i,j-1,k-1]),f[i-1,j-1,k-1]))+1;55 线性动态规划------日程安排f:=max{f[j]}+P[I]; (e[j]<s)56 递推天地------组合数C[I,j]:=C[i-1,j]+C[I-1,j-1]C[I,0]:=157 树形动态规划-----有向树k中值问题F[I,r,k]:=max{max{f[l,I,j]+f[r,I,k-j-1]},f[f[l,r,j]+f[r,r,k-j]+w[I,r]]}58 树形动态规划-----CTSC 2001选课F[I,j]:=w(if i∈P)+f[l,k]+f[r,m-k](0≤k≤m)(if l<>0)59 线性动态规划-----多重历史f[i,j]:=sigma{f[i-k,j-1]}(if checked)60 背包问题(+-1背包问题+回溯)-----CEOI1998 Substractf[i,j]:=f[i-1,j-a] or f[i-1,j+a]61 线性动态规划(字符串)-----NOI 2000 古城之谜f[i,1,1]:=min{f[i+length(s),2,1],f[i+length(s),1,1]+1}f[i,1,2]:=min{f[i+length(s),1,2]+words[s],f[i+length(s),1,2]+w ords[s]}62 线性动态规划-----最少单词个数f[i,j]:=max{f[I,j],f[u-1,j-1]+l}63 线型动态规划-----APIO2007 数据备份状态压缩+剪掉每个阶段j前j*2个状态和j*2+200后的状态贪心动态规划f:=min(g[i-2]+s,f[i-1]);64 树形动态规划-----APIO2007 风铃f:=f[l]+f[r]+{1 (if c[l]<c[r])}g:=1(d[l]<>d[r]) 0(d[l]=d[r])g[l]=g[r]=1 then Halt;65 地图动态规划-----NOI 2005 adv19910F[t,i,j]:=max{f[t-1,i-dx[d[[t]],j-dy[d[k]]]+1],f[t-1,i,j];66 地图动态规划-----优化的NOI 2005 adv19910F[k,i,j]:=max{f[k-1,i,p]+1} j-b[k]<=p<=j;67 目标动态规划-----CEOI98 subtraF[I,j]:=f[I-1,j+a] or f[i-1,j-a]68 目标动态规划----- Vijos 1037搭建双塔问题F[value,delta]:=g[value+a,delta+a] or g[value,delta-a]69 树形动态规划-----有线电视网f[i,p]:=max(f[i,p],f[i,p-q]+f[j,q]-map[i,j])leaves>=p>=l, 1<=q<=p;70 地图动态规划-----vijos某题F[I,j]:=min(f[i-1,j-1],f[I,j-1],f[i-1,j]);71 最大子矩阵问题-----最大字段和问题f:=max(f[i-1]+b,b); f[1]:=b[1]72 最大子矩阵问题-----最大子立方体问题枚举一组边i的起始,压缩进矩阵B[I,j]+=a[x,I,j]枚举另外一组边的其实,做最大子矩阵73 括号序列-----线型动态规划f[I,j]:=min(f[I,j],f[i+1,j-1](ss[j]=”()”or(”[]”)),f[I+1,j+1]+1 (s[j]=”(”or”[” ] , f[I,j-1]+1(s[j]=”)”or”]” )74 棋盘切割-----线型动态规划f[k,x1,y1,x2,y2]=min{min{f[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2],f[k-1,a+1,y1,x2,y2]+s[x1,y1,a,y2]min{}}75 概率动态规划-----聪聪和可可(NOI2005)x:=p[p[i,j],j]f[I,j]:=(f[x,b[j,k]]+f[x,j])/(l[j]+1)+1f[I,i]=0f[x,j]=176 概率动态规划-----血缘关系F[A, B]=(f[A0, B]+P[A1, B])/2f[I,i]=1f[I,j]=0(I,j无相同基因)77 线性动态规划-----决斗F[I,j]=(f[I,j] and f[k,j]) and (e[I,k] or e[j,k]),i<k<j78 线性动态规划-----舞蹈家F[x,y,k]=min(f[a[k],y,k+1]+w[x,a[k]],f[x,a[k],k+1]+w[y,a[k]])79 线性动态规划-----积木游戏F[I,a,b,k]=max(f[I,a+1,b,k],f[i+1,a+1,a+1,k’],f[I,a+1,a+1,k’])80 树形动态规划(双次记录)-----NOI2003 逃学的小孩朴素的话枚举节点i和离其最远的两个节点j,k O(n^2)每个节点记录最大的两个值,并记录这最大值分别是从哪个相邻节点传过来的。
树形动态规划PPT课件
例四、问题描述
学校开设了 N(N<300)门的选修课程,每 个学生可选课程的数量 M 是给定的。学生选 修了这 M 门课并考核通过就能获得相应的学 分。 在选修课程中,有些课程可以直接选修, 有些课程有一门直接的先修课。 你的任务是为自己确定一个选课方案,使得你 能得到的学分最多,并且必须满足先修课优先 的原则。假定课程之间不存在时间上的冲突。
引言
大多数动规都是在一维二维这种规则的 背景下的,可以解决的问题比较局限, 而树作为一种特殊的图,可以描述比较 复杂的关系,再加上树的递归定义,是 一种非常合适动规的框架,树型动态规 划就成为动规中很特殊的一种类型。
树
有n个点,n-1条边的无向图,任意两顶点间 可达 无向图中任意两个点间有且只有一条路 一个点至多有一个前趋,但可以有多个后继 无向图中没有环
动态规划
最优子结构:一个最优化策略的子策略 总是最优的。
无后效性:当前决策与过去状态无关。
引言
因为树可以描述比较复杂的关系,这对 选手分析问题的能力有较高的要求,在 寻找最优子结构、组织状态时往往需要 创造性思维,而且树型动态规划对数学 要求不高,不涉及单调性优化等方面, 所以竞赛中往往将它作为侧重考察选手 分析思考能力的题型出现。
树型动态规划
JSOI2010冬令营
动态规划
问题可以分解成若干相互联系的阶段, 在每一个阶段都要做出决策,全部过程 的决策是一个决策序列。要使整个活动 的总体效果达到最优的问题,称为多阶 段决策问题。动态规划就是解决多阶段 决策最优化问题的一种思想方法。
动态规划
阶段:将所给问题的过程,按时间或空间特征分解成若干相互联系的阶段,以便 按次序去求每阶段的解。 状态:各阶段开始时的客观条件叫做状态。 决策:当各段的状态取定以后,就可以做出不同的决定,从而确定下一阶段的状 态,这种决定称为决策。 策略:由开始到终点的全过程中,由每段决策组成的决策序列称为全过程策略, 简称策略。 状态转移方程:前一阶段的终点就是后一阶段的起点,前一阶段的决策选择导出 了后一阶段的状态,这种关系描述了由k阶段到k+1阶段状态的演变规律,称为 状态转移方程。 目标函数与最优化概念:目标函数是衡量多阶段决策过程优劣的准则。最优化概 念是在一定条件下找到一个途径,经过按题目具体性质所确定的运算以后,使全 过程的总效益达到最优。
动态规划题目选讲讲诉
思考
例题四
• f[i][j]表示前i件衣服达到j状态的方案 • 那么显然f[i][j]+=f[i-1][j] • 若班级k可以穿i这件衣服,则f[i][j]+=f[i-1][j-
(1<<(k-1))]
例题五:
• 在 W 星球上有 n 个国家。为了各自国家的经济发展,他们决定在 各个国家
• 之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝 啬,他们只愿
33 039 285 570
其他表示方式
以斜列即横坐标和纵坐标之和作为一维
例题四
• 题目描述: • 要开运动会了,神犇学校的n个班级要选班服,
班服共有100种样式,编号1~100。现在每个班 都挑出了一些样式待选,每个班最多有100个待 选的样式。要求每个班最终选定一种样式作为班 服,且该班的样式不能与其他班级的相同,求所 有可能方案的总数,由于方案总数可能很大,所 以要求输出mod 1000000007后的答案。
• 费用难以用人工计算,国王们决定找人设计一个软件, 对于给定的建造方案,计
• 算出所需要的费用。请你帮助国王们设计一个这样的软 件。
例题五:
• Input • 输入的第一行包含一个整数n,表示 W 星球上的国家的
数量,国家从 1到n • 编号。接下来 n – 1行描述道路建设情况,其中第 i 行包
• F[i][j][k][l]=max{F[i-1][j][k-1][l],
•
F[i-1][j][k][l-1],
•
F[i][j-1][k-1][l],
•
F[i][j-1][k][l-1]}
•
+a[i][j]+a[k][l].
动态规划题目选讲
例题二:加分二叉树
• 设一个n个节点的二叉树tree的中序遍历为( l,2,3,…,n),其中数字1,2,3,…,n为节点编号 。每个节点都有一个分数(均为正整数),记第 i个节点的分数为di,tree及它的每个子树都有 一个加分,任一棵子树(也包含tree本身的分数 • 若某个子树为主,规定其加分为1,叶子的加 分就是叶节点本身的分数。不考虑它的空子树。 • 试求一棵符合中序遍历为(1,2,3,…,n)且 加分最高的二叉树tree。
思考
例题六
• 对于 k=0 的情况: • 我们发现遍历一棵树最后回到原点,那么对于所 有的边,我们都是走过去,再走回来。 • 答案 (n-1)*2
例题六
• 对于 k=1 的情况 • 设每条边长度为1,然后树上找最长链,然后这 条链走过去就不再一步步往回了,直接从链底连 一条边去链顶,然后链中间连的那些点,直接走 过去再走回来,它们那些边的答案是不变的。 • 答案 (n−1)*2−(最长链长度)+1 • 可以证明不能减得更多啦。
• 资源和含有工厂的星球个数都不超过4 • n≤200
想法
暴力枚举匹配方案,求最短路?
想法
暴力枚举匹配方案,求最短路? 两条路径公用边怎么办?
思考
• 特殊的星球数量很少,可以枚举状态28=256
思考
• 特殊的星球数量很少,可以枚举状态28=256 • 如何表示状态?
• 设F[i][s]表示现在路径包含第i个星球, 已经连接上的特殊星球选择方案是s的最 少代价。 • 如何转移?
• 对于s的合并操作,枚举!
void Spfa(int s,int k){ int u,v,d,t; for(int top=1;top<=bot;top++){ u=Q[top]; for(int j=E[u].size()-1;j>=0;j--){ v=E[u][j];d=D[u][j];t=s|S[v]; if(F[u][s]+d*k<F[v][t]){ F[v][t]=F[u][s]+d*k; if(t==s&&V[v][s]){ V[v][s]=false;Q[++bot]=v; } } } V[u][s]=true; } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Thank you
借用了roba的 借用了roba的Party at Hali-Bula的ppt Hali-Bula的 感谢tju的roba! 感谢tju的roba! 数学科学学院 06级基础数学 描述集合论方向 汪方 06级基础数学 id:wangfangbob id: 邮箱:xiaofangbob@ 邮箱:xiaofangbob@
TSP
最后的结果是: min( dp[( 1<<n ) – 1][j] ) ( 0 <= j < n ); ); 技巧:利用2 技巧:利用2进制,使得一个整数表示一个点 集,这样集合的操作可以用位运算来实现. 例如从集合i中去掉点j 例如从集合i中去掉点j: k = i & ( ~( 1 << j ) ) 或者 k = i - ( 1 << j )
习题
树型动态规划 nkoj 1791 Party at Hali-Bula Halinkoj 1678 Strategic game nkoj 1794 Bribing FIPA (需要2重dp) (需要2 dp) poj 1946 Rebuilding Roads (需要2重dp) (需要2 dp) 状态压缩动态规划 nkoj 1068 Islands and Bridges poj 3229 The Best Travel Design poj 1038 Bugs Integrated, Inc.
Strategic game
题目大意: 一城堡的所有的道路形成一个n 一城堡的所有的道路形成一个n个节点的树, 如果在一个节点上放上一个士兵,那么和这 个节点相连的边就会被看守住,问把所有边 看守住最少需要放多少士兵. 典型的树型动态规划
Strategic game
dproot[ i ]表示以i为根的子树,在i上放置一个 ]表示以i为根的子树,在i 士兵,看守住整个子树需要多少士兵.
TSP
所以一个整数i 所以一个整数i就表示了一个点集; 整数i可以表示一个点集,也可以表示是第i 整数i可以表示一个点集,也可以表示是第i个 点. 状态表示:dp[i][j] 状态表示:dp[i][j]表示经过点集i中的点恰好 dp[i][j]表示经过点集i 一次,不经过其它的点,并且以j 一次,不经过其它的点,并且以j点为终点的 路径, 路径,权值和的最小值,如果这个状态不存在, 就是无穷大.
�
状态压缩动态规划
状态压缩动态规划: 动态规划的状态有时候比较恶心,不容易表 示出来,需要用一些编码技术,把状态压缩 的用简单的方式表示出来. 典型方式:当需要表示一个集合有哪些元素 时,往往利用2 时,往TSP
一个n 一个n个点的带权的有向图,求一条路径,使 得这条路经过每个点恰好一次,并且路径上 边的权值和最小(或者最大). 或者求一条具有这样性质的回路,这是经典 的TSP问题. TSP问题. n <= 16 (重要条件,状态压缩的标志) (重要条件,状态压缩的标志) 今天讲第一个问题的状态压缩动态规划的解 法,第2 法,第2个问题大同小异.
– 对于i的任一儿子j,若(dp[j][0] > dp[j][1] 且 对于i的任一儿子j,若(dp[j][0] dup[j][0] == 0) 或 (dp[j][0] < dp[j][1] 且 dup[j][1] == 0) 或 (dp[j][0] == dp[j][1]),则dup[i][0] = 0 dp[j][1]),则dup[i][0] – 对于i的任一儿子j有dup[j][0] = 0, 则dup[i][1] = 0 对于i的任一儿子j
最多人数即为max(dp[0][0], 最多人数即为max(dp[0][0], dp[0][1]) 如何判断最优解是否唯一? 如何判断最优解是否唯一?
Party at Hali-Bula Hali新加一个状态dup[i][j],表示相应的dp[i][j]是 新加一个状态dup[i][j],表示相应的dp[i][j]是 否是唯一方案. 对于叶子结点, 对于叶子结点, dup[k][0] = dup[k][1] = 1. 对于非叶子结点, 对于非叶子结点,
算法讲座
树型动态规划和状态压缩动态规划
树型动态规划
什么是树型动态规划: 树本身就是一个递归的结构,所以在树上进 行动态规划或者递推是在合适不过的事情. 必要条件:子树之间不可以相互干扰,如果 本来是相互干扰的,那么我们必须添加变量 使得他们不相互干扰.
Party at Hali-Bula Hali题目大意: n个人形成一个关系树,每个节点代表一个人, 节点的根表示这个人的唯一的直接上司,只 有根没有上司.要求选取一部分人出来,使 得每2 得每2个人之间不能有直接的上下级的关系, 求最多能选多少个人出来,并且求出获得最 大人数的选人方案是否唯一. 这是一个经典的树型动态规划.
Party at Hali-Bula Hali简单的染色统计是不正确的
Party at Hali-Bula Hali人之间的关系形成树型结构 DP, 用dp[i][0]表示不选择i点时,i点及其子树 dp[i][0]表示不选择i点时,i 能选出的最多人数,dp[i][1] 能选出的最多人数,dp[i][1]表示选择i点时,i dp[i][1]表示选择i点时,i 点及其子树的最多人数.
TSP
如何表示一个点集: 由于只有16个点,所以我们用一个整数表示 由于只有16个点,所以我们用一个整数表示 一个点集: 例如: 5 = 0000000000000101;(2进制表示) 0000000000000101;(2 它的第0位和第2位是1 它的第0位和第2位是1,就表示这个点集里有 2个点,分别是点0和点2. 个点,分别是点0和点2 31 = 0000000000011111; (2进制表示) 0000000000011111; 表示这个点集里有5个点,分别是0 表示这个点集里有5个点,分别是0,1,2, 4,5;
all[ i ]表示看守住整个以i为根的子树需要多少 ]表示看守住整个以i 士兵.
Strategic game
状态转移方程: 叶子节点:dproot[k] =1; 叶子节点:dproot[k] =1; all[k] = 0; 0; 非叶子节点: dproot[i] = 1 + ∑all[j](j是i的儿子); ∑all[j](j是 的儿子) all[i] = min( dproot[i], ∑dproot[j](j是i的儿 ∑dproot[j](j是 子) ); ); 这个题目还是比较简单的,如果把题目中看 守边变成看守相邻的点呢?留给你来思考^_^ 守边变成看守相邻的点呢?留给你来思考^_^
Party at Hali-Bula Hali状态转移方程: 状态转移方程:
– – – – 对于叶子节点 dp[k][0] = 0, dp[k][1] = 1 对于非叶子节点i, 对于非叶子节点i, dp[i][0] = ∑max(dp[j][0], dp[j][1]) (j是i的儿子) (j是 的儿子) dp[i][1] = 1 + ∑dp[j][0] (j是i的儿子) (j是 的儿子)
TSP
状态转移: 单点集:状态存在dp[i][j] 0;否则无穷大. 单点集:状态存在dp[i][j] = 0;否则无穷大. 非单点集: 状态存在 dp[i][j] = min(dp[k][s] + w[s][j]) k表示i集合中去掉了j点的集合,s遍历集合k 表示i集合中去掉了j点的集合,s遍历集合k 中的点并且dp[k][s]状态存在, 中的点并且dp[k][s]状态存在, 点s到点j有边 到点j 存在,w[s][j]表示边的权值. 存在,w[s][j]表示边的权值. 状态不存在 dp[i][j]为无穷大. dp[i][j]为无穷大.