`
lzj0470
  • 浏览: 1276813 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

动态规划实例篇

 
阅读更多
动态规划思想:
把问题规模不断缩小成小问题,并求解出小问题的结果,然后返回最优结果。
动态规划必须满足最优化原理和无后效性。
什么叫做最优化原理(最优子结构性质):
简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。
额外增加知识:
动态规划和递归不一样,递归是没有记录,对于同一个问题,出现多少次,会计算多少次。而动态规划不一样,对于相同的问题,只会计算一次。

下面以求最长公共子序列(LCS)为例:
问题描述
一个给定序列的子序列是在该序列中删去若干元素后得到的序列(元素的相对位置还是保持不变)。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有

例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B>的子序列,相应的递增下标序列为<2,3,5,7>。

给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X=<A, B, C, B, D, A, B>和Y=<B, D, C, A, B, A>,则序列<B, C, A>是X和Y的一个公共子序列,序列<B, C, B, A>也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。

最长公共子序列(LCS)问题:给定两个序列X=<x1, x2, …, xm>和Y=<y1, y2, … , yn>,要求找出X和Y的一个最长公共子序列。

解答
首先,要证明LCS是否有最优子结构性质。
设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一个最长公共子序列Z=<z1, z2, …, zk>,则:

(1)若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;
(2)若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;
(3)若xm≠yn且zk≠yn ,则Z是X和Yn-1的最长公共子序列。
其中Xm-1=<x1, x2, …, xm-1>,Yn-1=<y1, y2, …, yn-1>,Zk-1=<z1, z2, …, zk-1>。
在这里,重新描述一下。
问题对象(PO)是X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>
把PO问题不断降低规模,也就是
x<1,m-1> y<1,n-1>
x<1,m-2> y<1,n-2>
x<1,m-3> y<1,n-3>
......
求出这一系列问题的值,选择最优值。
这个就是动态规划思想啦。
根据上面(1)、(2)、(3),可以看出是不断降低问题规模,求出问题最优(最长)值。
因此,最长公共子序列问题具有最优子结构性质。
由性质导出子问题的递归结构
当 i = 0 or j = 0 时 , c[i][j] = 0
当 i , j > 0 ; xi = yi 时 , c[i][j] = c[i-1][j-1] + 1
当 i , j > 0 ; xi != yi 时 , c[i][j] = max { c[i][j-1] , c[i-1][j] }
如图所示:



相关代码如下:
        int[][] b = new int[x.length][y.length];  //记录c[i][j]是通过哪一个子问题的值求得的
        int[][] c = new int[x.length][y.length]; //记录X[i]与Y[j] 的LCS 的长度
        for(int i = 0; i < x.length; i++)
            c[i][0] = 0;
        for(int j = 1; j < y.length; j++)
            c[0][j] = 0;
        for(int i=1; i<x.length; i++)  
        {  
            for(int j=1; j<y.length; j++) 
            {  
                if( x[i] == y[j])  
                {  
                    c[i][j] = c[i-1][j-1] + 1;  
                    b[i][j] = 1;  
                }  
                else if(c[i-1][j] >= c[i][j-1])  
                {  
                    c[i][j] = c[i-1][j];  
                    b[i][j] = 0;  
                }  
                else  
                {  
                    c[i][j] = c[i][j-1];  
                    b[i][j] = -1;  
                }  
            }  
        }     

具体的LCS实现,请看这里
http://lzj0470.iteye.com/blog/1135649
  • 大小: 256 Bytes
  • 大小: 12.8 KB
分享到:
评论

相关推荐

    动态规划实例详解(动态规划实质及大量例题)

    本篇文章将深入探讨动态规划的实质及其在实际问题中的应用,通过实例解析其核心概念。 首先,动态规划的基本思想是将一个复杂的问题分解为一系列相互关联的子问题,通过对子问题的求解来得到原问题的解答。与分治法...

    分治递归动态规划贪心常用算法实例

    本篇文章将深入探讨三种常用的算法:分治、递归、动态规划以及贪心策略,并通过实例来阐述它们的应用和重要性。 首先,让我们来看分治算法。分治法是一种处理大问题的策略,它将大问题分解为若干个规模较小、相互...

    浅析动态规划算法

    在本篇博文中,我们将深入探讨动态规划的基本概念、常见类型、应用领域以及实现策略。 一、基本概念 动态规划起源于运筹学,由美国数学家Richard Bellman在20世纪50年代提出。它主要处理具有重叠子问题和最优子结构...

    动态规划算法学习十例之三

    在本篇文章中,我们将探讨动态规划的精髓,并通过具体实例进行深入学习。博客链接提供了详细的解析,虽然描述部分为空,但我们可以根据标题推测文章内容可能涵盖了至少十个关于动态规划的实际应用案例。 首先,我们...

    提高篇——动态规划专题PPT学习教案.pptx

    给定的课件“提高篇——动态规划专题PPT学习教案.pptx”就是一份专业的教学资源,它不仅涵盖了动态规划的基本概念和原理,还可能提供了丰富的实例和习题,帮助学生和开发者理解和掌握动态规划的应用。 在实际应用中...

    树形动态规划详细讲解

    ### 树形动态规划详细讲解 #### 一、树形动态规划概述 树形动态规划是一种特殊的动态规划方法,主要用于解决那些可以抽象成树形结构的问题。...希望本篇讲解能为你理解树形动态规划提供一定的帮助。

    动态规划求解背包问题

    本篇文章将深入探讨这两个背包问题以及如何使用动态规划来解决它们。 **0-1背包问题**: 0-1背包问题是一个典型的优化问题,它假设有一个容量有限的背包(背包容量为W),以及一系列物品,每件物品都有一个重量w[i]...

    算法文档无代码动态规划的深入探讨

    由于文档中没有提供具体的算法内容,而是通过百度网盘分享地址的方式,我们可以推断,这个文档可能包含了大量的动态规划实例、算法模板、详细的状态转移方程和算法思想的解释,以及可能的代码实现。 由于目前只能...

    动态规划,分治算法,概率算法,模拟退火算法,搜索算法,贪婪算法,网上matlab,遗传算法,组合算法

    本篇文章将深入探讨标题和描述中提到的一些核心算法,包括动态规划、分治算法、概率算法、模拟退火算法、搜索算法、贪婪算法、在线MATLAB应用、遗传算法以及组合算法。 1. **动态规划**:动态规划是一种解决具有...

    dp.rar_DP_动态规划 java_鍔ㄦ??瑙勫垝

    描述提到的“想学动态规划必读的几篇好论文,非常适合初学者”意味着压缩包可能包含一些经典论文或者教程,这些资料可以帮助初学者快速掌握动态规划的基本概念、思想和应用。 从标签"dp 动态规划__java 鍔ㄦ??瑙勫...

    用单调性优化动态规划

    本文将深入探讨如何利用单调队列和其他基于单调性的方法来优化动态规划问题,并通过具体的题目实例来说明其应用。 #### 正文 ##### 一、什么是单调队列 单调队列,是一种特殊的队列结构,其内部元素具有单调递增...

    动态规划模型Python代码

    本篇文章将深入探讨动态规划的基本概念、Python实现策略以及一个具体的动态规划模型实例。 首先,理解动态规划的核心思想是关键。动态规划通常应用于有重叠子问题和最优子结构的问题,例如背包问题、最长公共子序列...

    41丨动态规划理论:一篇文章带你彻底搞懂最优子结构、无后效性和重复子问题1-加水印.pdf

    在本篇内容中,我们将深入探讨这些概念,并通过一个实际问题来阐述它们如何应用于动态规划。 1. **最优子结构**:最优子结构是动态规划问题的核心特性,它表明问题的最优解可以由其子问题的最优解构建。在动态规划...

    第2章 树型动态规划 测试数据.rar

    对于“信息学奥赛一本通(提高篇)”中的测试数据,我们可以期待包含一系列的实例,用于检验我们的树型动态规划解决方案是否正确。这些实例可能包括不同的树结构、节点权重、目标函数等,旨在覆盖各种复杂情况,以全面...

    第1章 区间类型动态规划 测试数据.rar

    提高篇则意味着本书将深入探讨更为复杂的动态规划技巧和实例。 测试数据是检验算法正确性和效率的重要工具。在本压缩包中,"第1章 区间类型动态规划"可能包含了多个输入输出示例,用于验证你实现的动态规划算法是否...

    第3章 数位动态规划 测试数据.rar

    在提供的测试数据集中,你将找到一系列用于检验你对数位动态规划理解的实例。这些题目可能涉及但不限于以下几种类型: 1. **位操作**:如翻转二进制位、替换二进制位等,要求在有限的操作步数内达到某种目标状态。 ...

    第5章 单调队列优化动态规划 测试数据.rar

    在“信息学奥赛一本通(提高篇)”的第5章中,提供的测试数据可能包含了各种利用单调队列优化动态规划的问题实例,旨在帮助参赛者理解和掌握这一技巧。通过练习这些题目,你可以深入了解如何在实际问题中应用单调队列...

    动态规划算法学习十例之五

    标题中的“动态规划算法学习十例之五”表明这篇内容主要关注的是计算机科学中的动态规划算法,这是一种在解决复杂问题时非常有效的优化方法。动态规划通常用于处理具有重叠子问题和最优子结构的问题,通过将大问题...

    第6章 斜率优化动态规划 测试数据.rar

    在《信息学奥赛一本通(提高篇)》的第6章中,提供的测试数据旨在帮助读者通过实践理解并掌握斜率优化动态规划的运用。这些测试数据涵盖了各种复杂度和规模的问题实例,旨在检验学习者是否能够灵活应用斜率优化来提升...

Global site tag (gtag.js) - Google Analytics