动态规划的模型构建与优化方法

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


从上面的动态规划方程可以看出,该算法在 最坏的情况下时间复杂度将接近于 10000^2*100^3,由于最后要输出最优方案, 不可用滚动数组,因此它的空间复杂度为 o(10000*100^2),无论从时间还是空间上来 看,该算法都不适合于该问题。
算法二

只要仔细分析问题不难看出,该问题是要我们在输 入的第2至第N-1个数前面加减号,并且在这个式子 中添入N-1个括号,使得式子最终的计算结果为给定 的数T。我们不妨将所有的括号都拆掉,最后该式子 将会成为一个没有括号的加减式。注意:只要稍加 分析即可发现,该加减式的第二个数前面肯定是减 号。反过来考虑,如果一个加减式的第二个数前面 为减号,其余的数前面为“+”号或“-”号(第一 个前面没有符号),那么该式子能否变为一个由N-1 个括号和和减号组成的等价式呢?答案是肯定的。
重叠子结构
2 是否具有:
最优子结构
4
编程求解
3
构建对应模 型
动态规划是一种用于求解前后关联具有链状结构的多阶段决策过 程的最优化问题的方法
什么是动态规划?
(一)动态规划是解决多阶段决 策问题的一种方法。
多阶段决策问题

对于整个问题,可以根据其时间或 其他顺序分成若干个前后相关联的子问 题,问题的全局最优包含其子问题的局 部最优,即满足最优子结构性质,并且 无后效性,有边界条件,且一般划分为 很明显的阶段,存在一条或多条状态转 移方程。
记忆化搜索与动态规划


记忆化搜索实际上是一种递归形式的动态规划,所以它无论从 时间上还是从空间上来看都与后面的动态规划算法差不多。 记忆化搜索的特点是可以使动态规划算法看起来比较直观,它 能让我们比较清楚的看出动态规划是如何具体用空间换取时间 的。它的最大优点是,只要发现了搜索的重复计算之处,用它 可以很快的优化算法。 在竞赛中,我们可以先编一个搜索程序,如果这个题目可以用 动态规划解决,一般都可以采用记忆化搜索,这样我们可以在 事先有一个搜索保本的情况下考虑动态规划,最后即便是没有 想到怎样用记忆化搜索做,至少也会有一个搜索保本,比较划 算。




示例:
con([12 ,10, 4, 3, 5],2)=[12 ,6,3,5] con([12,6,3,5],3)=[12 ,6,-2] con([12,6,-2],2)=[12,8] con([12,8],1)=[4]
算法一



看了题目最容易想到动态规划算法是石子合并问题与骨牌问 题相结合的方法。其算法如下: 设F[I,J,K]表示将第I个数到第J个数按规则压缩,最后 能否压缩成数K。不难得出动态转移方程为: F[I,J,K] = False or (F[I,M,K1] and F[M + 1, J, K1- K]) 其中I<=M<J, K1取所有F[I,M]可以压缩成的数。 边界:F[I,I,I]=TRUE 如果F[1,N,T]的值为真,该问题有解,否则无解。至 于求具体方案,可以用一个父结点数组记下推出F[I,J,K] 的M、K1值。也可在最后用一个反向的动态规划找最优方案 。


如果要按问题的要求输出方案,我们只要拿几个式子推一 下即可发现,只要将所有加减号按其在式子中的位置顺序记 录到一个字符串数组中,先输出所有加号当前在数组中的位 置(按左到右的顺序输出),每输出一个加号的位置就将该 加号从字符串中删去,当没有加号时,看式子中有多少个减 号就输出多少个2。该方法不太好证明,不过只要用实例试 着推一下就可以肯定它是正确的。 12-(10-4)+(3-5) =12-10+4+3-5 S=‘-++-’ 输出 2 3 2 1
对例一的优化


我们期望对于每个i,快速找到最优决策j ,而这可以通过线段树进行优化。 或者是换一个方程,用G[i]表示长度为i 的最长不下降子串结尾最少是多少。很 明显G[i]是不下降的。那么对于每个a[i] 用二分查找最大的j是的G[j]<=a[i],那 么F[i]:=G[j]+1,同时令G[F[i]]:=a[i]。
在竞赛中我们可以先编一个搜索程序如果这个题目可以用动态规划解决一般都可以采用记忆化搜索这样我们可以在事先有一个搜索保本的情况下考虑动态规划最后即便是没有想到怎样用记忆化搜索做至少也会有一个搜索保本比较划记忆化搜索也有缺点当动态规划空间不足需要用滚动数组时它显然是无法用程序实现的这就要我们在审题时能够准确估出该问题用动态规划大概所需空间提前判断它是否能用记忆化搜索做
由此可见,字串A、B和C的最长公共字串 包含了三个字串前缀的最长公共字串,说明该 问题具备最优子结构的性质。
设f[I,j,k]为a’i,b’j,c’k的一个最长公共子串 的长度(0≤i≤m,0≤j≤n,0≤k≤h)。f[m,n, h]为问题的解,则状态转移方程为:当(j=0) or (k=0)时,f[I,j,k]=0; 当(ai=bj=ck)时,f[I,j,k]= f[I-1,j-1, k-1]+1; 当 ( ai≠bj ) 或 ( bj≠ck ) 时 , f[I , j , k]=max{f[I-1,j,k],f[I,j-1,k],f[I,j, k-1]}。
记忆化搜索与动态规划

记忆化搜索也有缺点,当动态规划空间不足 需要用滚动数组时,它显然是无法用程序实 现的,这就要我们在审题时能够准确估出该 问题用动态规划大概所需空间,提前判断它 是否能用记忆化搜索做。
例题一(线性规划模型)



最长非降子序列问题。 给你一字排开的n个数,按从左往右的顺 序选择m个满足这m个数保持非降。 用F[i]表示以第i个数结尾的序列最长能有 多长。 F[i]:=max(F[j])+1;j<i and a[j]<=a[i]
继续


用meet[i,j]表示i,j能否相遇,如果存在一个 k(i<k<j),meet[i,k] and meet[k,j]=true,并 且i或j能击败k。 注意到[i,k],[k,j]都是[i,j]的子区间,也就是 说对于某个区间的决策都是它的子区间。 所以可以按区间长度从小到大来动规。
序列压缩
性质1:am=bn=ch,则dk=am=bn=ch且d’k1是a’m-1,b’n-1,c’h-1的一个最长公共子串。 性质2:am≠bn,am≠ch,bn=ch,则蕴含D 是a’m-1和B、C的一个最长公共子串。
性质3:bn≠am,bn≠ch,am=ch,则蕴 含D是b’n-1和A、C的一个最长公共子串。 性质4:ch≠am,ch≠bn,am= bn,则蕴 含D是c’h-1和A、B的一个最长公共子串。
动态规划模型 构建与优化
长沙市第一中学 曹利国
综述



动态规划是运筹学的一个分支,是求解 决策过程最优化的数学方法。 动态规划活跃在各种信息学竞赛,是因 为其强大的实用性,可扩展性。 动态规划程序设计是对解最优化问题的 一种途径、一种方法、一种思维方式, 而不是一种明确算法。
分析思路
1 是否包含:



有了上面的分析,我们不难得出下面的动态规划算法: 设F[I,J]表示在前I个数中添加减号,可否使式子的值为J。 显然:F[I, J]=F[I-1,J + A[I]] OR F[I – 1, J – A[I]] A[I]表示数I的值。 边界:F[1,2] = A[1]-A[2] (第二个数前面必须添减 号) 当F[N,T]的值为真时,该问题有解,否则无解。 由于最后求最优方案时要找路径,所以该算法最大空间 复杂度为o(100*10000) 时间复杂度最大为o(100*10000*2)

我们将连续的带“+”号的数用一个大括号括 起来,就可把所有的“+”号变为减号,然后 再在减号前面加一些无意义的括号即可(无 意的括号实际上是加上以后不改变式子计算 结果的括号)。



一个实例: a1-a2+a3+a4+a5-a6-a7+a8+a9+a10-a11 我们首先将连续带加号的数用括号括起来,那么式子就变为 : a1-(a2-a3-a4-a5)-a6-(a7-a8-a9-a10)-a11 此时所有的加号就变为了减号,我们还要在不将减号变为加 号的情况下添完剩下的括号,其实这一步已经很好做了,最 后的式子如下: (a1-(((((a2-a3)-a4)-a5)-a6)-(((a7-a8)-a9)-a10)))-a11))
取石子游戏



N堆石子排成一行,每堆石子中有X[i]个石子,两人轮流从中 取出石子,规定每次只能从最左边或最右边取出一堆石子, 直至石子被全部取出,每个人所取的石子的总个数为个人的 最后得分,得分多的人获胜。若两人得分相同,则规定首先 取的人获胜。 如果游戏开始时N为偶数,则对首先取的人来说,存在一 种必胜的策略。 请你编一个程序,作为首先取石子的人,寻找一种必胜的策 略和计算机玩这个游戏,并让你自己保持不败。
例题二(区间模型)

决斗问题 已知n个人之间的决斗的胜负情况,现在 n个人围成一圈,相邻的人可以决斗,输 的就挂了,然后被移走,问是否有一种 决斗顺序让X最终获胜。
解法



把x差成两个点x1,x2,展开,问题转化成两个x能 否相遇。 正难则反,从最后一步考虑。 最后肯定剩下3个x1,t,x2。x1到t之间的都输了,t 到x2之间的都输了。现在要x1打败t或x2打败t就 行了。 注意这些事件发生的顺序:首先用某种顺序让x1 与t相遇,然后用某准顺序让x2与t相遇,最后让 x1或x2打败t。

分析
Байду номын сангаас
设b[i,j]表示第i到第j堆石子中,计算机最多可获得的得分,且 总堆数j-i+1为偶数 动态转移方程为: b[i,j]=max(a[i]+min(b[i+2,j],b[i+1,j-1]), a[j]+min(b[i,j-2],b[i+1,j-1])) 初始条件为?
什么是动态规划?
给出一个N个正整数的序列A=[A1,A2,……,AN],我们可以对 其进行压缩操作.所谓压缩操作是指:将两个相邻的元素AI和AI+1的差(AI-AI+1)去替代第I个元素,同时删去第I+1 个元 素,严格地可以定义如下: CON(A,I)=[A1,,A2,….,AI-1,AI-AI+1,AI+2,…….AN] 经过一次序列压缩之后,我们可以得到一个N-1个元素的 序列,如此进行下去,我们可以仅得到单一的一个整数。现 给定一个正整数序列和一个目标整数T,求解并输出压缩 顺序。 1〈=N〈=100,-10000〈=T〈=10000
(二)动态规划实际上就是一种排除重
复计算的算法,更具体的说,动态规划 就是用空间换取时间。
动态规划的核心——记忆化


动态规划算法通过将待求解的问题分解成若 干个相互联系的子问题,先求解子问题,然 后从这些子问题的解的方法得到原问题的解 。 对于重复出现的子问题,只在第一次遇到的 时候对它进行求解,并把答案保存起来,让 以后再次遇到时直接引用答案,不必重新求 解。
分析
首先,定义一个字串“前缀”的概念:
给定一个字串s=s1…sm。对于I=0..m,定义s的 第I个前缀为s’I=s1…si。三个输入串A,B,C的所有 前缀组成了最长公共子串的子问题空间。由此,我 们发现最长公共子串的最优子结构性质。 设 : A={a1 , … , am} ; B={b1 , … , bn} ; C={c1 , … , ch} 。 A , B , C 的 最 长 公 共 子 串 为 D={d1,…,dk},D的长度为k。
最长公共子串问题(lcs)
有两个字符串A,B,当存在一个严格递增的整 数 序 列 i1 , i2 , … , im , 满 足 a1=bi1 , a2=bi2 , … , am=bim ,我们则说A包含于B。例如,“adg”包含于 “abcdefg”,而不包含于“gfedcba”。现在有三个字符 串A,B,C,要求你找出一个满足以下条件的最长的 字符串D。①D包含于A;②D包含于B;③D包含于C。 输入:A,B,C。输出:D。
分析



对于这道题,第一感觉便是贪心,但贪心存在反例:6,10,4,5 。便也只能采用动态规划的方法。 因为N是偶数,所以可将问题划分成N/2个阶段,第i个阶 段处理所有相邻的2i堆石子, 相当于双方的第N/2-i+1个回合。对每一种状态,作出取左边 还是取右边的决策,同时,还需要考虑计算机作出决策后, 人也要作出相应的最佳决策。 看起来对于人的两种决策,似乎有些难以考虑,但只要将 人作出最佳决策转化为计算机作出较差决策,问题便迎刃而 解。
相关文档
最新文档