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

最大值的递归算法

对于一个数组 有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(index > n)      return sum/(index-1)
    else
        return Ave(a,sum+=a[index],index+1)

汉诺塔的 递归算法

void move(int n,char left,char middle,char right)
{
    if(n==1)//移动1号盘
         cout<<n<<"号盘"<<":"<<left<<"→"<<right<<endl;
    else{
        move(n-1,left,right,middle);
        cout<<n<<"号盘"<<":"<<left<<"→"<<right<<endl;//移动n号盘
        move(n-1,middle,left,right);
    }
}

动态规划问题

Lcs 最长子序列 递归式

ai = bi L[i,j] = L[i-1,j-1] + 1;

ai!= bi L[i,j] = max{L[i-1,j],L[i,j-1]}

Floyd 最短路径 递归式

0- 1 背包的 递归式

si > j  V[i,j] = V[i-1,j]         //当前背包大小小于物品的体积

si =< j V[i,j] = max{V[i-1,j],V[i-1,j-si]+vi}//当前的背包大小大于等于物品的体积

当 0 - 1 背包 变成 完全背包的 时候

可以修改以上的递归式 修改为 一下 格式k = si/j

si > j  V[i,j] = V[i-1,j]         //当前背包大小小于物品的体积

si =< j V[i,j] = max{V[i-1,j],V[i-1,j-k*si]+k*vi}//当前的背包大小大于等于物品的体积

3着色问题 的 递归算法

输入:无向图G=(V,E)
输出:图的结点3着色向量c[1..n],1≤c[k]≤3(1≤k≤n)。
1.    GraphColorRec(1)
过程 GraphColorRec(k)
1.     for color←1 to 3
2.          c[k]←color
3.          if c[1..k]为合法着色 then    //部分解或解
4.              if k=n then             //解
5.              output c[1..n] and exit
6.              else                 //部分解
7.              GraphColorRec(k+1)     //进入下一个结点
8.              end if
9.          end if
10.       end for

4皇后问题 递归算法

输入:空
输出:对应于4皇后问题的向量c[1..4](全局量)
    1.    advanced(1)
过程 advanced(k)
1.          for col←1 to 4         //最多只有4列
2.        c[k]←col
3.        if c[1..k]是解 then     //部分解或解
4.              if k=4 then     //完全解
5.            output c[1..4] and exit
6.              else         //部分解
7.                    advanced(k+1) //移至下一行
8.              end if
9.        end if
10.           end for
时间: 2025-01-19 15:28:09

一些常见的递归算法 动态规划算法的相关文章

贪心算法,递归算法,动态规划算法比较与总结

一般实际生活中我们遇到的算法分为四类: 一>判定性问题        二>最优化问题        三>构造性问题        四>计算性问题 而今天所要总结的算法就是着重解决  最优化问题 <算法之道>对三种算法进行了归纳总结,如下表所示:   标准分治 动态规划 贪心算法 适用类型 通用问题 优化问题 优化问题 子问题结构 每个子问题不同 很多子问题重复(不独立) 只有一个子问题 最优子结构 不需要 必须满足 必须满足 子问题数 全部子问题都要解决 全部子问题都要

动态规划算法(Dynamic Programming,简称 DP)

动态规划算法(Dynamic Programming,简称 DP)似乎是一种很高深莫测的算法,你会在一些面试或算法书籍的高级技巧部分看到相关内容,什么状态转移方程,重叠子问题,最优子结构等高大上的词汇也可能让你望而却步. 而且,当你去看用动态规划解决某个问题的代码时,你会觉得这样解决问题竟然如此巧妙,但却难以理解,你可能惊讶于人家是怎么想到这种解法的. 实际上,动态规划是一种常见的「算法设计技巧」,并没有什么高深莫测,至于各种高大上的术语,那是吓唬别人用的,只要你亲自体验几把,这些名词的含义其实

动态规划分析总结——如何设计和实现动态规划算法

进行算法设计的时候,时常有这样的体会:如果已经知道一道题目可以用动态规划求解,那么很容易找到相应的动态规划算法并实现:动态规划算法的难度不在于实现,而在于分析和设计-- 首先你得知道这道题目需要用动态规划来求解.本文,我们主要在分析动态规划在算法分析设计和实现中的应用,讲解动态规划的原理.设计和实现.在很多情况下,可能我们能直观地想到动态规划的算法:但是有些情况下动态规划算法却比较隐蔽,难以发现.本文,主要为你解答这个最大的疑惑:什么类型的问题可以使用动态规划算法?应该如何设计动态规划算法? 动

动态规划算法的理解

什么是动态规划算法? 动态规划算法其实质就是分治思想和解决冗余.因此它与分治法和贪心法类似,都是将待求解问题分解为更小的,相同的子问题,然后对子问题进行求解,最终产生一个整体最优解. 适合采用动态规划法求解的问题,经分解得到的各个子问题往往不是相互独立的.在求解过程中,将已解决的子问题的解进行保存,在需要时可以轻松地找出. 示例如下: Fibonacci数列       0   n=0 f(n)=  1   n=1 f(n-1)+f(n-2)    n>1 如果n=4,则f(4)=f(3)+f(

动态规划 算法(DP)

多阶段决策过程(multistep decision process)是指这样一类特殊的活动过程,过程可以按时间顺序分解成若干个相互联系的阶段,在每一个阶段都需要做出决策,全部过程的决策是一个决策序列.动态规划(dynamic programming)算法是解决多阶段决策过程最优化问题的一种常用方法,难度比较大,技巧性也很强.利用动态规划算法,可以优雅而高效地解决很多贪婪算法或分治算法不能解决的问题.动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子

动态规划算法求解0,1背包问题

首先我们来看看动态规划的四个步骤: 1. 找出最优解的性质,并且刻画其结构特性: 2. 递归的定义最优解: 3. 以自底向上的方式刻画最优值: 4. 根据计算最优值时候得到的信息,构造最优解 其中改进的动态规划算法:备忘录法,是以自顶向下的方式刻画最优值,对于动态规划方法和备忘录方法,两者的使用情况如下: 一般来讲,当一个问题的所有子问题都至少要解一次时,使用动态规划算法比使用备忘录方法好.此时,动态规划算法没有任何多余的计算.同时,对于许多问题,常常可以利用其规则的表格存取方式,减少动态规划算

动态规划算法解最长公共子序列LCS问题

第一部分.什么是动态规划算法 ok,咱们先来了解下什么是动态规划算法. 动态规划一般也只能应用于有最优子结构的问题.最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似).简单地说,问题能够分解成子问题来解决. 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方式计算最优解的值   //此3步构成动态规划解的基础. 由计算出的结果构造一个最优解.   //此步如果只要求计算最优解的值时,可省略. 好,接下来,咱们

记表备查-----动态规划算法

1.最优子结构 ?组合优化问题,指的是问题有多个可行解,每一个可行解对应一个目标值,目的是要在可行解中求得目标值最优者(最大或最小). ?最优子结构特性指的是问题的最优解包含的子问题的解相对于子问题而言也是最优的. 2.子问题重叠 ?问题的一个递归算法在每个递归步骤产生分支子问题时并不总是新的,而是对部分子问题解了又解.当一个递归算法一次又一次地访问同一个子问题时,我们说该最优化问题具有重叠子问题的特性. 3.动态规划 ?针对具有上述两个特征的优化问题,动态规划算法通常需要做如下的3步工作: ?

动态规划算法(java)

一.动态规划算法 众所周知,递归算法时间复杂度很高为(2^n),而动态规划算法也能够解决此类问题,动态规划的算法的时间复杂度为(n^2).动态规划算法是以空间置换时间的解决方式,一开始理解起来可能比较困,自己画画也许明白了很多. 二.动态规划算法分析 先举个例子: {7,0,0,0,0},{3,8,0,0,0},{8,1,0,0,0},{2,7,4,4,0},{4,5,2,6,5} 这个二维数组,求一下,顶层到底层,只能通过两端来相加的最大值(也就是说这棵树的最长路径). 分析: (1)第一步: