`
lzj0470
  • 浏览: 1254781 次
  • 性别: 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年代提出。它主要处理具有重叠子问题和最优子结构...

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

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

    动态规划求解背包问题

    本篇文章将深入探讨这两个背包问题以及如何使用动态规划来解决它们。 **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章中,提供的测试数据旨在帮助读者通过实践理解并掌握斜率优化动态规划的运用。这些测试数据涵盖了各种复杂度和规模的问题实例,旨在检验学习者是否能够灵活应用斜率优化来提升...

    算法合集之《从《鹰蛋》一题浅析对动态规划算法的优化》1

    总的来说,《从《鹰蛋》一题浅析对动态规划算法的优化》这篇文章为我们提供了一个生动的实例,展示了如何通过多种方法优化动态规划算法,以及优化背后的思想。这对于我们学习和应用动态规划有着重要的指导意义,提醒...

    旅行商问题-动态规划解法.rar

    旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题,它在图论和运筹学中占有重要地位。在这个问题中,一个旅行商需要访问n个城市,每个...不过,这些方法超出了本篇讨论的动态规划解法的范畴。

    模糊控制实例,模糊控制实例100篇,matlab源码.zip

    在本压缩包中,“模糊控制实例100篇,matlab源码.zip”包含了一百个模糊控制的实例以及相应的MATLAB源代码。MATLAB是一款强大的数学计算软件,同时也是实现模糊控制系统设计和仿真的常用工具。 一、模糊控制基础 1....

    3D游戏开发大全高级篇实例

    7. **AI设计**:高级篇可能涵盖如何创建智能非玩家角色(NPCs),包括路径规划、行为树和决策逻辑。这部分内容有助于增加游戏的挑战性和可玩性。 8. **优化技术**:3D游戏对性能要求高,了解内存管理、多线程和绘制...

    参考资料-“鲁中山水大观园——莱芜雪野休闲度假区规划.zip

    如果能提供一个与动态规划相关的压缩包或更具体的信息,我将很乐意为您深入解析动态规划算法及其应用实例。如需了解动态规划的基本概念、原理、示例代码或相关问题的解决方案,请提供更合适的素材,我将确保提供一篇...

Global site tag (gtag.js) - Google Analytics