最近研究网上的各种面经,看到有很多公司的面试题都是关于动态规划的,所以想总结一下自己对于动态规划的理解。我一直非常仰慕那些参加过ACM/ICPC的牛人,他们往往能够很快就能对题目做出分析,并给出应对的算法。笔者曾经做过一些ACM的题目,里面动态规划的题目也不在少数,而且ACM的题目有个特点:很多时候你认为是一道图论题的时候他恰恰是一道要用动态规划来解答的题目,就像东野圭吾的小说「嫌疑犯X的献身」中数学家石神出的数学题一样,表面上是几何问题其实是函数问题。蛋有点扯远了,我只想告诉大家,相比背诵问题的答案,分析问题的方法才是最重要的。

在介绍动态规划之前,先看一个大家很熟悉的例子。

斐波那契数列的递归定义:

F0 = 0

F1 = 1

Fn = Fn-1 + Fn-2

很容易可以写出代码:

int fibonacci(int n){if(n==0) return 0;else if(n==1) return 1;else return fibonacci(n-1)+fibonacci(n-2);}

  但是递归的效率并不高,如果画出递归树,会发现很多值被重复计算。一个好的想法是把已计算的结果保存下来,以后做重复任务的时候直接可以获取,以减少不必要的递归。改进以后的代码如下:

#include <iostream>#include <memory.h>#define N 100using namespace std;

int array[N];

int fibonacci(int n){if(array[n]!=-1) return array[n];if(n==0)return 0;else if(n==1) return 1;else    {        array[n]=fibonacci(n-1)+fibonacci(n-2);return array[n];    }}

int main(){    memset(array,-1,sizeof(array));//初始化备忘数组为-1    cout << fibonacci(8);return 0;}

  所以在我看来动态规划的基本思想就是保存递归时的结果,因而不会在解决同样的问题时花费时间 。动态规划通常用于求解最优化问题,他同分治算法类似,都是将待求解的问题分解为若干子问题,先求解子问题然后得出原问题的解。与分治不同之处在于分治算法各个子问题是互相独立的而动态规划类的子问题往往是相互联系的。

同样是求解最优化问题的贪心算法与动态规划的区别在于贪心算法追求每一步都达到最优,而动态规划则是追求整体的最优。

要使用动态规划算法必须满足最优化原理和无后效性。最优化原理就是:一个最优化策略的子策略总是最优的。而无后效性简而言之就是当前的决策与过去的状态无关。

使用动态规划算法的步骤:(1)分析最优解的性质,并刻画其结构特征。(2)递归定义最优值。(3)以自底向上或者自顶向下的记忆方法计算最优值。

动态规划的有一些经典题目:背包问题、矩阵链乘、最长公共子序列……可以拿来做一下,加深自己的印象。

【参考文献】ACM程序设计竞赛基础教程

转载于:https://www.cnblogs.com/hardcandy/archive/2011/08/04/2127919.html

“动态规划算法”那些事儿相关推荐

  1. 矩阵连乘算法代码JAVA_矩阵连乘问题的动态规划算法(java)

    /** * 下面是矩阵连乘问题的动态规划算法 * 假设有6个矩阵: * A1 A2A3 A4 A5A6 * 30*35 35*15 15*5 5*10 10*20 20*25 则matrixChain ...

  2. 五大常用算法之二:动态规划算法

    基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 基本思想与策略 基本思想与分 ...

  3. 矩阵连乘问题(动态规划算法)

    动态规划算法思想简介: 将一个问题分解为多个子问题,这点和分治法类似,但是每个子问题不是独立的而是相互联系的,所以我们在求解每个子问题的时候可能需要重复计算到其他的子问题,所以我们将计算过的子问题的解 ...

  4. 实验二 动态规划算法 最大字段和问题

    基本题二:最大字段和问题 一.实验目的与要求 1.熟悉最长最大字段和问题的算法: 2.进一步掌握动态规划算法: 二.实验题 若给定n个整数组成的序列a1,a2,a3,...,an,求该序列形如ai+a ...

  5. 【字符串】最长回文子串 ( 动态规划算法 ) ★

    文章目录 一.回文串.子串.子序列 二.最长回文子串 1.动态规划算法 2.动态规划算法代码示例 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都 ...

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

    动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...

  7. 贪心、递归、递推以及动态规划算法的分析与对比

    PS:   头一次规规矩矩的按照论文的格式写文章,呵呵.虽然是小儿科的不能再小儿科的东西了..不过..也忽悠了6000多字~~嘿嘿..肯定写的不好,第一次嘛..所以..接受大家一切批评哈!...文章N ...

  8. 动态规划算法的优化技巧

    动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化.全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因 ...

  9. 漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)

    在前两集漫画中,我们通过一个算法问题的完整解题过程,讲述了动态规划的基本概念和思想.没看过前两集的朋友可以点击下面的链接: 漫画说算法–动态规划算法一(绝对通俗易懂,非常棒) 漫画说算法–动态规划算法 ...

最新文章

  1. Xamarin Andro教程搭建Xamarin Androidid开发环境(一)
  2. 网络编程之 TCP / UDP 及其流程比较
  3. 画个火山图,标记下基因的名字
  4. puml绘制思维导图_强推:9款超好用思维导图APP
  5. 巧用gmail转发邮件
  6. Windows域控设置IE浏览器收藏夹链接地址策略 【全域策略生效】
  7. IIS未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
  8. html post提交中文数据,HTML使用post方式提交中文内容出现乱码的错误解决方式
  9. 一文读懂图像局部特征点检测算法!
  10. Word在试图打开文件时遇到错误
  11. findContours函数详细解析
  12. 辛巴学院-Unity-剑英陪你零基础学c#系列(一)Hello World
  13. Css---vertical-align 属性的用法与应用
  14. Unity-UGUI制作的小地图-可放大缩小视角,大地图小地图切换
  15. 动量指标进行空间预测
  16. 屏蔽Alt+F4等快捷键
  17. 为什么今天安全仍然重要
  18. Couchebase命令行工具cbq
  19. 视频质量评价方法:VQM
  20. 【有利可图网】PS实战系列:PS制作多层次折叠纸张字

热门文章

  1. 2022璞跃中国第二期武汉创新加速营入营名单出炉!
  2. 自学考试之概率论与数理统计知识框架
  3. 作为全职程序员的第一个月
  4. 碌碌无为的一年研究生生活
  5. 多看阅读 必须要选择两次才能翻译句子 的解决
  6. 开源OA办公系统:企业通讯录功能“零”成本搭建使用
  7. EM算法:三硬币模型
  8. [软件更新]Flash Builder 4和Flash Catalyst的Beta2下载(新增大米盘下载)
  9. java江湖2新手开局攻略_放置江湖完美开局攻略
  10. ArcGIS对矢量数据进行缓冲区分析和叠加分析具体操作