常见动态规划算法问题策略分析
算法设计与分析中的动态规划问题研究

算法设计与分析中的动态规划问题研究动态规划是一种常用的算法设计与分析方法,它在解决许多问题时具有较高的效率和准确度。
本文将结合实例,深入研究动态规划在算法设计与分析中的应用。
动态规划是一种通过分解问题,将大问题转换为小问题并求解小问题的方法。
它与分治法类似,但动态规划所分解的小问题可能重叠,因此可以将解决过的小问题保存起来,避免重复计算,提高效率。
动态规划常用于求解最优化问题,如寻找最大值或最小值。
一个经典的动态规划问题是背包问题。
背包问题是指给定一个背包以及一系列物品,每个物品都有自己的价值和重量。
背包的容量是有限的,我们的目标是在保持背包总重量不超过容量的情况下,选择一些物品放入背包,使得背包中物品的总价值最大。
假设我们有n个物品,背包的容量为W,我们可以使用一个二维数组dp[i][j]来表示前i个物品恰好放入容量为j的背包的最大价值。
dp[i][j]的值可以通过以下的状态转移方程得到:dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])其中,w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。
根据状态转移方程,我们可以通过填表的方式,自底向上地计算dp[n][W],即前n个物品放入容量为W的背包的最大价值。
除了背包问题,动态规划还可以用于求解其他类型的优化问题。
比如,在图论中,最短路径和最小生成树问题也可以使用动态规划来求解。
例如,最短路径问题可以通过定义一个二维数组dp[i][j]来表示从顶点i到顶点j的最短路径的长度。
通过状态转移方程dp[i][j] =min(dp[i][j], dp[i][k] + dp[k][j]),我们可以逐步更新dp数组,最终得到从起点到终点的最短路径长度。
对于最小生成树问题,可以先计算任意两个顶点之间的最短路径,然后通过Prim算法或Kruskal算法来生成最小生成树。
除了上述问题,动态规划还可以用于解决其他一些经典问题,如编辑距离、最长公共子序列等。
动态规划方法求解线性规划问题

动态规划方法求解线性规划问题标题:动态规划方法求解线性规划问题引言概述:动态规划是一种解决多阶段决策过程中最优化问题的方法,通过将问题分解为子问题并利用之前计算的结果来减少计算量,从而找到最优解。
在线性规划问题中,动态规划方法可以有效地求解最优解,提高计算效率。
正文内容:一、线性规划问题的定义1.1 线性规划问题是指在一系列约束条件下,求解线性目标函数的最优解的问题。
1.2 线性规划问题通常包括决策变量、目标函数和约束条件。
1.3 线性规划问题的目标是找到使目标函数取得最大值或最小值的决策变量取值。
二、动态规划方法的原理2.1 动态规划方法将原始问题分解为多个子问题,并利用之前计算的结果来减少计算量。
2.2 动态规划方法通常包括确定状态、状态转移方程和边界条件。
2.3 动态规划方法适用于满足最优子结构和重叠子问题性质的问题。
三、动态规划方法在线性规划问题中的应用3.1 将线性规划问题转化为动态规划问题,可以有效地求解最优解。
3.2 动态规划方法可以处理包含多个决策变量和约束条件的复杂线性规划问题。
3.3 动态规划方法在求解线性规划问题时能够提高计算效率,减少计算时间。
四、动态规划方法的实例分析4.1 假设有一个包含多个产品的生产计划问题,需要在有限资源下最大化利润。
4.2 可以将该生产计划问题转化为线性规划问题,并利用动态规划方法求解最优生产计划。
4.3 动态规划方法可以帮助生产计划问题的决策者找到最优的生产方案,实现最大利润。
五、动态规划方法的优势和局限性5.1 动态规划方法在求解线性规划问题时具有较高的计算效率和准确性。
5.2 动态规划方法可以处理复杂的线性规划问题,并找到最优解。
5.3 动态规划方法的局限性在于对问题的状态转移方程和边界条件的确定需要一定的经验和技巧。
结论:动态规划方法在求解线性规划问题中具有重要的应用意义,可以帮助决策者找到最优解,提高计算效率,实现最大化利益。
通过深入理解动态规划方法的原理和应用,可以更好地解决线性规划问题,实现决策优化。
《算法设计与分析》第3章 动态规划法

最优解的递推关系 定义m[i:j],表示矩阵连乘A[i:j]所需的最少计算 量 则有: i j 0 m[i ][ j ] i j minj{m[i ][ k ] m[k 1][ j ] pi 1 pk p j } i k
假设:N个矩阵的维数依序放在一维数组p中, 其中Ai的维数记为Pi-1×Pi
A=A1×A2×A3×…×An
A=(A1×A2×…×Ak) × (Ak+1×Ak+2×…×An)
B
C
1.2 穷举法
穷举法:列举出所有可能的计算次序,并计算出 每一种计算次序相应需要的数乘次数,从中找出 一种数乘次数最少的计算次序。
穷举法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序有P(n)种。 由于每种加括号方式都可以分解为两个子连乘的加括号问题: (A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
【程序】矩阵连乘的 穷举法实现 int MatrixChain::LookupChain(int i, int j) { if(i==j) return 0; int u=LookupChain(i+1,j)+p[i-1]*p[i]*p[j]; //k=i s[i][j]=i; //记录最优分解位置 for ( int k=i+1;k<j; k++ ) { //遍历k int t=LookupChain(i,k)+LookupChain(k+1,j) +p[i]*p[k+1]*p[j+1]; if (t<u) { u=t; s[i][j]=k; //记录最优分解位置 } } int MatrixChain::LookupChain() return u; { } return LookupChain(1,n);
动态规划算法详解及经典例题

动态规划算法详解及经典例题⼀、基本概念(1)⼀种使⽤多阶段决策过程最优的通⽤⽅法。
(2)动态规划过程是:每次决策依赖于当前状态,⼜随即引起状态的转移。
⼀个决策序列就是在变化的状态中产⽣出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
假设问题是由交叠的⼦问题所构成,我们就能够⽤动态规划技术来解决它。
⼀般来说,这种⼦问题出⾃对给定问题求解的递推关系中,这个递推关系包括了同样问题的更⼩⼦问题的解。
动态规划法建议,与其对交叠⼦问题⼀次重新的求解,不如把每⼀个较⼩⼦问题仅仅求解⼀次并把结果记录在表中(动态规划也是空间换时间的)。
这样就能够从表中得到原始问题的解。
(3)动态规划经常常使⽤于解决最优化问题,这些问题多表现为多阶段决策。
关于多阶段决策:在实际中,⼈们经常遇到这样⼀类决策问题,即因为过程的特殊性,能够将决策的全过程根据时间或空间划分若⼲个联系的阶段。
⽽在各阶段中。
⼈们都须要作出⽅案的选择。
我们称之为决策。
⽽且当⼀个阶段的决策之后,经常影响到下⼀个阶段的决策,从⽽影响整个过程的活动。
这样,各个阶段所确定的决策就构成⼀个决策序列,常称之为策略。
因为各个阶段可供选择的决策往往不⽌⼀个。
因⽽就可能有很多决策以供选择,这些可供选择的策略构成⼀个集合,我们称之为同意策略集合(简称策略集合)。
每⼀个策略都对应地确定⼀种活动的效果。
我们假定这个效果能够⽤数量来衡量。
因为不同的策略经常导致不同的效果,因此,怎样在同意策略集合中选择⼀个策略,使其在预定的标准下达到最好的效果。
经常是⼈们所关⼼的问题。
我们称这种策略为最优策略,这类问题就称为多阶段决策问题。
(4)多阶段决策问题举例:机器负荷分配问题某种机器能够在⾼低两种不同的负荷下进⾏⽣产。
在⾼负荷下⽣产时。
产品的年产量g和投⼊⽣产的机器数量x的关系为g=g(x),这时的年完善率为a,即假设年初完善机器数为x,到年终时完善的机器数为a*x(0<a<1);在低负荷下⽣产时,产品的年产量h和投⼊⽣产的机器数量y 的关系为h=h(y)。
动态规划问题解决策略概述

动态规划问题解决策略概述动态规划(Dynamic Programming)是一种用于解决多阶段决策问题的优化方法。
它通过拆分问题为多个阶段,并逐步求解每个阶段的最优解,从而得到全局最优解。
动态规划常被应用于许多领域,如经济学、物理学和计算机科学等。
一、动态规划原理动态规划的核心原理是最优子结构和重叠子问题。
最优子结构意味着问题的最优解可以通过子问题的最优解来构造。
对于一个给定问题,如果它具有最优子结构,那么我们可以通过将问题分解为若干子问题来解决,然后再将它们的最优解合并以得到原问题的最优解。
重叠子问题指的是在求解问题的过程中,我们会反复遇到相同的子问题。
为了避免重复计算,我们可以采用记忆化搜索或者动态规划的方式将子问题的解存储起来,以便后续的计算直接使用。
二、动态规划解决步骤1. 确定状态:首先要明确问题涉及的状态是什么,即问题的子问题是什么。
2. 定义状态转移方程:根据问题的最优子结构,我们可以定义状态转移方程来表示子问题的最优解与原问题的最优解之间的关系。
3. 初始化边界条件:在动态规划求解的过程中,通常还需要初始化一些边界条件,用于递推过程的开始。
4. 递推求解:根据状态转移方程和初始化边界条件,使用递推的方式求解每个子问题的最优解,并将其存储起来以备后续使用。
5. 返回结果:最终根据子问题的最优解,得到原问题的最优解。
三、案例分析以经典的背包问题为例,介绍动态规划的具体应用过程。
问题描述:给定一个固定容量的背包,和一些物品,每个物品都有自己的重量和价值。
要求从这些物品中选择一些放入背包,使得在满足背包容量的前提下,背包内物品的总价值最大。
解决步骤:1. 确定状态:在背包问题中,每个物品可以选取或者不选取,因此可以定义状态dp[i][j]表示在前i个物品中,背包容量为j时的最大价值。
2. 定义状态转移方程:对于第i个物品,有两种情况:(1)不选取第i个物品,则dp[i][j] = dp[i-1][j];(2)选取第i个物品,则dp[i][j] = dp[i-1][j - weight[i]] + value[i];综合两种情况,状态转移方程为:dp[i][j] = max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i])。
基于动态规划算法的最值问题分析

文章编号 : 1 0 0 5 — 1 2 2 8 ( 2 0 1 3) 0 6 — 0 0 2 3 — 0 3
基 于动态规划算法 的最值 问题分析
陈 捷
( 泰 州学院 数理信 息学院 江 苏 泰 州 2 2 5 3 0 0 ) 摘 要: 动态规 划法是 一种 重要 的求最优解 的计 算机程序设计算 法, 在各 类软件设 计大赛等各类程序设计 大赛 中广泛运
f f k ( X k ) = o p t { q O (  ̄ k ( X k , k ) , f k + 1 ( x k + 1 ) ) J , X k + l = T k ( X k , k ) , k = l , 2 , …, n
【 01 x 1 ) = 8 ( x n + 1 )
( T  ̄z h o u Un i v e m i t y Ma t h e ma i t c a l I n  ̄r ma d o n I n s t i t u t e , T ̄ z h o u 2 2 5 3 0 0 , Ch i n a )
Ab s t r a c t : Dy n a mi c p r o g r a mmi n g i s a n i mp o r t a n t c o mp u t e r p r o g r a mmi n g lg a o r i t h m f o r t he o p t i ma l s o l u d o r  ̄ wi d e l y u s e d i n a l l k i n d s o f s o f t wa r e d e s i g n c o n t e s t a n d o t h e r k i n d s o f p r o ra g m d e s i n g c o n t e s t .I n t h i s p a p e r , hr t o u g h t h e d e s i g n o f a p p r o p ia r t e s t a t e t r a n s f e r e q u a i t o n , we u s e t wo k i n d s o f l a g o r i t h ms or f s o l v i n g t h e mo s t v l a u e p r o b l e m,a n d e ic f i e n t d y n a mi c p r o ra g mmi n g me ho t d i s v e i r i f e d t h r o u g h c o mp a r a t i v e e x p e i r me n t s o n t h e s o l v i n g p r o c e s s a n d t h e s o l v i n g t i me e ic f i e n c y . Ke y wo r d s : d y n a mi c p r o ra g mn i f n g a l g o it r h m ; e x t r e me v a l u e p r o b l e ms ;e ic f i e n c y o f lg a o i r t h m
动态规划算法--01背包问题

动态规划算法--01背包问题基本思想:动态规划算法通常⽤于求解具有某种最优性质的问题。
在这类问题中,可能会有许多可⾏解。
每⼀个解都对应于⼀个值,我们希望找到具有最优值的解。
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若⼲个⼦问题,先求解⼦问题,然后从这些⼦问题的解得到原问题的解。
与分治法不同的是,适合于⽤动态规划求解的问题,经分解得到⼦问题往往不是互相独⽴的(即下⼀个⼦阶段的求解是建⽴在上⼀个⼦阶段的解的基础上,进⾏进⼀步的求解)。
若⽤分治法来解这类问题,则分解得到的⼦问题数⽬太多,有些⼦问题被重复计算了很多次。
如果我们能够保存已解决的⼦问题的答案,⽽在需要时再找出已求得的答案,这样就可以避免⼤量的重复计算,节省时间。
我们可以⽤⼀个表来记录所有已解的⼦问题的答案。
不管该⼦问题以后是否被⽤到,只要它被计算过,就将其结果填⼊表中。
这就是动态规划法的基本思路。
具体的动态规划算法多种多样,但它们具有相同的填表格式。
应⽤场景:适⽤动态规划的问题必须满⾜最优化原理、⽆后效性和重叠性。
1、最优化原理(最优⼦结构性质)最优化原理可这样阐述:⼀个最优化策略具有这样的性质,不论过去状态和决策如何,对前⾯的决策所形成的状态⽽⾔,余下的诸决策必须构成最优策略。
简⽽⾔之,⼀个最优化策略的⼦策略总是最优的。
⼀个问题满⾜最优化原理⼜称其具有最优⼦结构性质。
2、⽆后效性将各阶段按照⼀定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态⽆法直接影响它未来的决策,⽽只能通过当前的这个状态。
换句话说,每个状态都是过去历史的⼀个完整总结。
这就是⽆后向性,⼜称为⽆后效性。
3、⼦问题的重叠性动态规划将原来具有指数级时间复杂度的搜索算法改进成了具有多项式时间复杂度的算法。
其中的关键在于解决冗余,这是动态规划算法的根本⽬的。
动态规划实质上是⼀种以空间换时间的技术,它在实现的过程中,不得不存储产⽣过程中的各种状态,所以它的空间复杂度要⼤于其它的算法。
动态规划问题常见解法

动态规划问题常见解法
动态规划是一种高效解决优化问题的方法。
它通常用于涉及最
优化问题和最短路径的计算中。
下面是一些常见的动态规划问题解法:
1. 背包问题
背包问题是动态规划中的经典问题之一。
其目标是在给定的背
包容量下,选择一些物品放入背包中,使得物品总价值最大。
解决
这个问题的常见方法是使用动态规划的思想,定义一个二维数组来
记录每个物品放入背包时的最大价值,然后逐步计算出最终的结果。
2. 最长公共子序列问题
最长公共子序列问题是寻找两个字符串中最长的公共子序列的
问题。
解决这个问题的常见方法是使用动态规划的思想,定义一个
二维数组来记录两个字符串中每个位置的最长公共子序列的长度。
然后通过递推关系来计算出最终的结果。
3. 矩阵链乘法问题
矩阵链乘法问题是计算一系列矩阵相乘的最佳顺序的问题。
解
决这个问题的常见方法是使用动态规划的思想,定义一个二维数组
来记录每个矩阵相乘时的最小乘法次数,然后逐步计算出最终的结果。
4. 最长递增子序列问题
最长递增子序列问题是寻找一个序列中最长的递增子序列的问题。
解决这个问题的常见方法是使用动态规划的思想,定义一个一
维数组来记录每个位置处的最长递增子序列的长度,然后通过递推
关系来计算出最终的结果。
以上是一些常见的动态规划问题解法。
通过灵活运用这些方法,我们可以更高效地解决优化问题和最短路径计算等相关任务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常见动态规划算法问题
策略分析
目录
一、动态规划策略 (1)
1.动态规划介绍 (1)
2.求解动态规划问题步骤 (1)
二、几种动态规划算法的策略分析 (1)
1.装配线调度问题 (1)
2.矩阵链乘问题 (2)
3.最长公共子序列(LCS) (3)
4.最大字段和 (4)
5.0-1背包问题 (4)
三、两种解决策略 (5)
1.自底向上策略 (5)
2.自顶向上(备忘录)策略 (5)
3.优缺点分析 (5)
四、总结 (6)
一、动态规划策略
1.动态规划介绍
动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。
一个决策序列就是在变化的状态中产生出来的,所以,这种多
阶段最优化决策解决问题的过程就称为动态规划。
基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的
求解提供了有用的信息。
在求解任一子问题时,列出各种可能的局部
解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。
依次解决各子问题,最后一个子问题就是初始问题的解。
由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在
一个二维数组中。
与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建
立在上一个子阶段的解的基础上,进行进一步的求解)。
2.求解动态规划问题步骤
(1)确定最优解结构
(2)递归定义最优解的值
(3)自底向上计算最优解的值
(4)重构最优解
二、几种动态规划算法的策略分析
1.装配线调度问题
分析:首先确定最优解结构,分析问题可知大致分为两种情况:
从第一个站出站(j=1)和从第j 个站出站(j>=2)。
当j=1:货物上线后只经过一个站,f 1[j]=e
1+a 1,1 当j>=2,又可分为跳线和不跳线两种情况:
不跳线:f 1[j]=f 1[j-1]+a 1,j
跳线:当货物从f2跳到f1,有一个跳转时间t 2,j-1,则:f 1[j]=f 2[j-1]+t 2,j-1+a 1,j
由对称关系,f 2[j]可同理得出,最后:
??1,??={??1+??1,1 ??
=1min (??1,??-1+??1,??,??2,??-1
+??2,??-1+??1,?? ) ??≥2 ??2,??={??2+ ??2,1 ??=1min(??2,??-1+??2,??,??1,??-1+ ??1,??-1+??2,??
) ??≥2传输完后,加上自动下线时间x 1,x 2,总装配时间:
???=min {??1,??+??1,??2,??+??2}
最后采用自底向上的方法求解算法并递归的输出最优解的值。
2.矩阵链乘问题
分析:若只有一个矩阵,无最优解。
若大于一个矩阵:对于A 1,A 2,…,A n ,我们得在A k 和A k+1之间加上一个括号使得分开的两个子矩阵链乘积最小,再分别对两个子问题找到最优的划分结果:设m[i,j] 为计算矩阵链A i..j 的乘积所需的最少标量乘法次数。
若:i=j ,不需任何计算,即m[i,j]=0
,否则:????,?? =????,??+ ????+1,??+????-1????????则最终公式为:
??1,??={0 ??=??
min(????,??+ ????+1,??+????-1????????
) ??<??
在计算时,采用了自底向上的方法来求解最优解,在求解过程中
用一个辅助的数组S[1….n-1,2….n]来记录最优值m[i,j]对应的分割点K,这样能够构造出最优解。
最后,借助辅助数组递归
的输出最优解的值。
3.最长公共子序列(LCS)
分析:可分为最后一个元素相同和不相同两种情况:
最后一个元素相同:求X[1…m-1]和Y[1…n-1]两个子序列的最长公共子序列。
最后一个元素不同:求X[1…m-1]和Y[1…n]或者X[1…m-1]和Y[1…n]两个子序列的最长公共子序列。
令C[i,j]为????和????的LCS的长度,如果i=0或者j=0则LCS=0,则根据LCS的最优子结构特征我们可以构造出:
??[??,??]={
0 ??
=0 ???? ??
=0 ??[??-1,??-1]+ 1 ??,
??>0 ?????? ??
[??]=??[??] max(C[??-1,??],??[??,??-1]) ??,??>0 ?????? ??
[??]≠??[??]
根据递归式,我们能写出一个递归算法来计算最长公共子序列,
由于LCS的子问题过多,所以我们采用自底向上的计算。
在这个过程中,我们需要借组一个数组b[i,j]来记录最优解得构造过程,利用b[i,j]所记录的元素来输出最优解。
4.最大字段和
分析:求给定的n个整数(可能但不全为负)a1,a2,…,an, 的i 跟j,使 ai 到 aj 的和最大。
我们定义b[j]=max(sum(i:j)),为从i到j子段的最大子段和。
我们比较b[j-1]+a[j]和a[j]的大小,如果b[j-1]<0,显然b[j-1]不是最大子段,此时
b[j]=a[j]。
反之,我们令b[j-1] + a[j] = b[j],找出最大的子段和。
则:b[j]=max( b[j-1]+a[j], a[j] ), 1<=j<=n
由上面的递归公式我们可以写出一个自底向上的递归算法,在算
法中我们借助一个变量sum来记录过程中的最大子段和,若此时的b[j]>sum,更新sum中的值,反之,继续求解。
直到程序进行完毕,输入sum中的最大子段和。
5.0-1背包问题
分析:分数背包问题可以采用贪心策略解决,但我们在求解0-1
背包问题时,我们只能采用动态规划策略。
同样地:首先构造最优子结构。
令c[i,j]表示利用前i个物品装容量为j的背包所能获得的最大价值,可分两种情况:
含物品n:去掉第n个物品,用W-w n容量的背包装物品
1,2,…,n-1:c[i,j]=c[i-1,j-w i]+v i
不含物品n:用W容量背包装物品1,2,…,n-1:c[i,j]=c[i-1,j]
当然,没有物品或没有容量,c[i,j]=0
则总的递归式:
??[??,??]={0 ??
=0 ???? ??
=0 ??[??-1,??]????>?? max(C[??-1,??- ????]+ ????,??[??-1,??]) ??>0 ?????? ????≤??
有上述递归方程,就可写出相应递归算法,但该递归算法复杂度
太高,可用V[0..n,0..W]来保存子问题(i,j)的最大值。
b[1..n,1..W]用来保存所做出的最优选择,以便构造最优解。
在
计算最优解的时候,保存所做出的最优决策,便可得到最优解。
三、两种解决策略
1.自底向上策略
一般动态规划问题都是基于此策略。
在用这种方法时一般需要恰
当的定义子问题的规模,使得任何子问题都只依赖于更小的子问
题的求解。
我们可以将问题的规模按照由大到小排列依次求解。
每个子问题都只求解一次。
2.自顶向上(备忘录)策略
动态规划有一个性质为子问题重叠性质,就是对于子问题在递归
过程中不断求解,虽然问题规模很小,但是求解次数会非常多,
造成程序运行非常慢。
在使用自顶向下的求解过程中,我们一般
要设计一个备忘录,在递归求解过程中对于已经求解过的问题保
存在备忘录中,当下次要使用时直接拿出来,不用再次求解。
3.优缺点分析
自顶向下只需要求解问题需要的解,不需要对所有子问题都去求
解。
但是它需要额外的递归开销。
自底向上必须对所有子问题进
行求解但是可有效减少计算时间和所需的存储空间。
四、总结
动态规划算法通常用于求解具有某种最优性质的问题。
在这类问
题中,可能会有许多可行解。
每一个解都对应于一个值,我们希
望找到具有最优值的解。
解决动态规划问题的关键是找到最最优
子结构并定义出递归式,根据经验,通常会分为若干种情况分开
讨论,尤其注意容易遗漏的特殊情况(0、1、相等…)。
在求解计
算时,如果我们能够保存已解决的子问题的答案,而在需要时再
找出已求得的答案,这样就可以避免大量的重复计算,节省时
间。
我们可以用一个表来记录所有已解的子问题的答案。
不管该
子问题以后是否被用到,只要它被计算过,就将其结果填入表
中。
这就是动态规划法的基本思路。
具体的动态规划算法多种多
样,但它们具有相同的填表格式。