动态规划与递归联系。

问题描述

动态规划与递归联系。

求教各位,以前一直觉得动态规划就是对递归的优化,最近发现并不是。我想请问各位动态规划和递归之间有什么联系吗?还是说动态规划和递归没关系。

解决方案

动态规划和递归毫无关系,事实上也没有“递归优化”这种说法。
动态规划的思想是将要解决的问题转化为一系列逐步求解的问题并且逐步加以解决。动态规划避免了无意义的穷举,它强调逐步解决问题,让先前解决的结果可以作为后续解决问题的条件避免重复求解相同的问题。
举一个例子,最长公共子序列问题(我曾经解答过,完整代码在这里:http://ask.csdn.net/questions/237208),传统的穷举是那第一个字符串的任意子序列去匹配第二个的任何子序列,比如说比较abc和bcd,abc的所有子串是
a
b
c
ab
bc
abc
而bcd是
b
c
d
bc
cd
bcd
然后再把它们两两比较,找到b c bc,最后找到最长的bc。这是无意义的穷举。
用动态规划,我们将它们转化为后缀数组,然后排序
a
ab
abc
b
b-2
bc
bc-2
bcd-2
c-2
cd-2
d-2
注意,因为C语言可以用首地址+长度表示一个字符串,实际上我们并不需要穷举就能得到子串
我们把子串排列起来,自然相邻的字符串才能匹配上。所以只要比较相邻的就可以了。
为什么第二个方法要比第一个方法好,因为第一个方法做了很多重复的事情,如果a和b匹配不上,它和c更匹配不上,但是显然在没有序的集合里匹配,它就是在做重复工作。

动态规划的过程中局部、整体等都可以采用递归,也可以不用。比如如上算法,其中排序的环节,你就可以用快速排序,它就是一个递归分治的过程。

解决方案二:

递归:将问题分解成子问题求解,从较小的问题逐渐逼近原始问题,很多时候只需要在f(n-1)中加入或移除某些东西或稍作修改就可以求得f(n)

动态规划与递归的区别:动态规划要将中间的结果缓存起来以备后续使用

解决方案三:

递归和动态规划
递归和动态规划
动态规划和递归

解决方案四:

动态规划主要是那个函数

解决方案五:

递归只是动态规划的一种实现方式
动态规划可以递归实现,也可以递推实现

时间: 2025-01-21 10:45:24

动态规划与递归联系。的相关文章

java循环匹配递归的问题

问题描述 java循环匹配递归的问题 wuxian递归的问题 wuxian递归的问题wuxian递归的问题wuxian递归的问题 wuxian递归的问题wuxian递归的问题 wuxian递归的问题 wuxian递归的问题wuxian递归的问题 wuxian递归的问题 解决方案 ?解决方案二: 这是基本的java问题啊,flag是值拷贝,你在函数里无论怎么改变,出来当然不对, private static int digui(String displayName, ArrayList> obje

字符串相似度算法 递归与动态规划求解分析

1.概念 编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数.许可的编辑操作包括:(1)将一个字符替换成另一个字符,(2)插入一个字符,(3)删除一个字符. 相似度,等于"编辑距离+1"的倒数. 2.分析 设有字符串a[0...n],b[0...m]. (1)当a[i]=b[j]时,说明这时候不需要编辑操作.编辑距离保持,即f(i,j)=f(i-1,j-1) (2)当a[i]!=b[j]时,可以有三种编辑操作. 其中删除和插入操作,只对一个下标i或者j产生影响.如

动态规划(DP)入门

零.先修课程 首先,在开始理解DP的思想前,你需要 1. 完成HDU里面的递推求解专题练习(For Beginner)那7道题(这些题很简单,题解请在博客中搜索),这对你理解DP有很大的帮助. 2. 对递归搜索(比如深度优先搜索,DFS)有一定了解. 一.递归与记忆化搜索 我们从POJ 3176入手来学习这一思想.(题目很短,请快速读完) 从上往下看,最大和值无非是往左走和往右走这两条路的较大者.这样,我们可以写出下面这个重要的递归函数:(这里i表示行,j表示列) int f(int i, in

用动态规划算法对最大子串问题的java实现

最大字串问题描述大概就是给定2个字符串,找出他们两个共有的最长字符串.比如一个是"tabcfg"另外一个"abckj"那么最大子串就是"abc". 动态规划算法最重要的就是分解问题,找出递归.说一下我的思考思路,首先拿到2个字符串,如何找到最长子串呢? 1.假设他们(字符串a,b)的头字母不相同的话,那么分别去掉首字母比较,也就是说用a.subString(1)和b比较,用 b.subString(1)和a比较,最长子字符串没变吧?答案是肯定的.

我对递归的认识

首先明确一点: 递归是不符合人自然的逻辑思维的,需要训练. (1)递归的例子 求5的阶乘 /*** * 阶乘 * @param n * @return */ public static int arrayArrange(int n){ if(n<2){ return 1; }else{ return n*arrayArrange(n-1); } } arrayArrange方法体中调用了自身,只是参数不同. 求1到100的和 public static int getSum(int n){ if

一些常见的递归算法 动态规划算法

最大值的递归算法 对于一个数组 有A[ 1...n ] 算法调用的时候调用max(n) max(i) if i = 1 return A[i] else if A[i]>max(i-1) return A[i] else return max(i-1) end if end if 平均值的递归算法 对于数组 a[ 1...n ] sum 初值为 0 index 初值则为1 调用该算法使用 Ave(a,sum,index) Ave(int a[],int sum,int index) if(ind

动态规划笔试题

1.最长公共子序列.最长公共子串 最长公共子序列(Longest-Common-Subsequence,LCS) dp[i][j]:dp[i][j]表示长度分别为i和j的序列X和序列Y构成的LCS的长度 dp[i][j] = 0,如果i=0 或 j=0  dp[i][j] = dp[i-1][j-1] + 1,如果 X[i-1] = Y[i-1]  dp[i][j] = max{ dp[i-1][j], dp[i][j-1] },如果 X[i-1] != Y[i-1] LCS长度为 dp[Xle

算法洗脑系列(8篇)——第七篇 动态规划

     今天跟大家分享下算法思想中比较难的一种"动态规划",动态规划给人像是作战时常用的"迂回战术",或者说是 游击战,在运动中寻找突破口.   一: 思想    首先要了解"动态规划",必须先知道什么叫做"多阶段决策",百科里面对这个问题解释的很全,我就load一段出来, 大家得要好好品味,好好分析.   上面图中最后一句话就定义了动态规划是要干什么的问题.   二:使用规则     现在我们知道动态规划要解决啥问题了,那

动态规划算法

斐波纳契数列F(n) n 0 1 2 3 4 5 6 7 8 9 10 F(n) 1 1 2 3 5 8 13 21 34 55 89 递归 vs 动态规划 递归版本(太慢): int f(int n) { if(n <= 1) return 1; else return f(n-1)+f(n-2); } 动态规划版本(有效率!算法复杂度是 O(n)): int a[1000]; int f(int n) { a[0]=a[1]=1; for(int i=2; i<=n; i++) a[i]=