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

最大值的递归算法

对于一个数组 有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-02 21:37:16

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

动态规划算法

斐波纳契数列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]=

【算法导论】动态规划算法之装配线调度

        和分治算法一样,动态规划是通过组合子问题的解而解决整个问题的.但是与分治算法不同的是,动态规划算法适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题.动态规划通常用于最优化问题的求解.看一个问题是否适合采用动态规划算法,主要有两个标志:最优子结构和重叠子问题. 最优子结构:问题的一个最优解包含了子问题的最优解. 重叠子问题:当一个递归算法不断地调用同一问题时,我们说该最优子问题包含重叠子问题. 动态规划算法的设计步骤如下: 1.描述最优解的结构. 2.递归定义最优解的值

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

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

动态规划算法计算网络的最长路线和最短路线

/* * File: longest.c * Desciption: 动态规划算法计算网络的最长路线和最短路线 * Created: 2001/12/2 * Author: Justin Hou [mailto:justin_hou@hotmail.com] * */ #include <stdio.h> #define N 7 /* 顶点数目 */ #define I 999 /* 表示无穷大 */ int graph[N][N] = { /* 图的邻接矩阵 */ {I, 4, 5, 8,

五大常用算法之二:动态规划算法(DP)

一.基本概念     动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 二.基本思想与策略     基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息.在求 解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解.依次解决各子问题,最后一个子问题就是初始问题的解.

常见面试之机器学习算法思想简单梳理

前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大. 纵观IT行业的招聘岗位,机器学习之类的岗位还是挺少的,国内大点的公司里百度,阿里,腾讯,网易,搜狐,华为(华为的岗位基本都是随机分配,机器学习等岗位基本面向的是博士)等

算法——动态规划算法

动态规划法基本思想:将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解.著名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等. 个人对动态规划的理解,主要就是避免重复计算.就是那些曾经发生过的事情,曾经计算过的值先保存下来,然后再次遇到相同的子问题的时候,直接用保存好的值给出,不再进行计算. 有一个很简单的例子,关于斐波那契数列.   什么是斐波那契数列?根据维基百科的解释是这样的, 费波那西数列(Fibonacci Sequence),又译费波拿契数.斐波那

递归算法-数据结构 算法 递归

问题描述 数据结构 算法 递归 编写一个递归算法,删除二叉树中所有叶子结点. 解决方案 void foo(Node * node) { if (node->left != null) { if (node->left->left == null && node->left->right == null) { delete(node->left); node->left = null; } else { foo(node->left); } }

动态规划算法--蛮力算法求最大子段和

问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+-+a[j]},1<=i<=j<=n 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20. 最大子段和是动态规划中的一种. 当b[j-1]>0时b[j]=