动态规划本质上就是一种带有数组的分治思想
那么动态规划什么时候用呢?
类似于这种

 可以发现,当计算 f(n) 的时候,需要用到 f(n 2 1),当计算 f(n - 1) 的时候,还是
需要用到 f(n - 2),这样,一个子问题就要计算 k 次,显然增加了时间复杂度,这种时候
就需要用到动态规划了,将所有的子问题都用一个数组记录下来,避免重复计算,可以说,
动态规划的精髓就在于数组记录状态和状态转移方程。DP:1、分析子问题的依赖关系(子问题:重叠)2、采用自底向上的方法依次求解3、从最小规模求解,一直到最大子问题注:子问题不管是否用到,都要计算出来保存起来子问题放到表格里面。

一、斐波那契数列

int get(int n)
{if(f[n]){return f[n];}f[n] = get(n - 1) + get(n - 2);return f[n];
}
在使用前将 f[0] 和 f[1] 初始化为 1 即可。

二、K级图问题

 K 级图定义为:每一级有若干个结点,一共有若干个级,每一级只能由上一级指入,
只能指向下一级,且从一级前往下一级的节点会有 h 的权重,并且第一级和最后一级
都只有一个节点,求从开始节点到最后节点的最短路径。

图示:

可以看到,要想求 7 号的最短路径,要先求出 4、5、6 的最短路径,如果采用递归的
方式,那么势必要计算 3 次 2号节点的最短路径,或许这对于这里的二号节点是可以接受
的,但是当级数增加,级内节点增加,那么一个 k 号节点的重复计算次数便不可估计,所以
递归方法便变得不可接受了,如果用数组将 k 号节点的最短路径保存起来,当用到的时候
取出来,这样便可以避免重复运算了,这就是动态规划的思维,所以这道题可以这样求解1、定义一个节点类型struct Node{int min_path;Node * from;};struct point{int x, y;};同时定义一个二维数组或者用 map<point, int> 来保存点与点直接的消耗2、每一节点的 min_path = min(上一级各点 min_path + 上一级各点到该点的消耗)3、在计算 min_path 的同时更新该点的 from 为使得 min_path 最小的上一级点的编号4、最后的 min_path 就是该点的 最短路径长度,最短路径只需要根据 from 字段依次向前寻址即可当然,在做这一切之前将最简单的子问题 0号的min_path 初始化即可

三、格路问题

格路问题定义:对于一个给定的网格,每一条路径上都有一个权值,求从(0,0)到
(m,n)的最短路径这个问题本质上与 K 级图类似,求解(m,n)的最短路径,由于最短路径只能从
上或者右走,所以(m,n)有两个子问题,左边或者下边,所以只需要求解 min(下边
最短路径+向上的边,左边最短路径+向右的边),同样,子问题再分解成为子问题,
这时你会发现,有很多点的子问题都要重复计算,所以,可以采用二维数组将这个最短路
径的数值保存起来,即用即取,于是1、定义一个结构体struct Node{int min_path;Node * from;};2、初始化最简单的子问题是 第0行 和 第0列,因为他们只有一个来源,因此只需要不断加起来计算 min_path 就好3、对于一般的点来说,进行两重循环,按照下面的状态转移方程计算min_path = min(下边最短路径+向上的边,左边最短路径+向右的边);4、输出(m,n)的 min_path 即可,求最短路径的方式只需要从(m,n)开始不断的“from” 即可。

算法设计与分析——动态规划相关推荐

  1. 算法设计与分析-----动态规划

    算法设计与分析-----动态规划(c语言) 一.动态规划 1.定义 2.动态规划问题的解法 3.动态规划求解的基本步骤 4.动态规划与其他方法的比较 5.求解整数拆分问题 6.求解最大连续子序列和问题 ...

  2. 算法设计与分析——动态规划(二):钢条切割

    分类目录:<算法设计与分析>总目录 相关文章: · 动态规划(一):基础知识 · 动态规划(二):钢条切割 · 动态规划(三):矩阵链乘法 · 动态规划(四):动态规划详解 · 动态规划( ...

  3. 算法设计与分析——动态规划(五):最长公共子序列

    分类目录:<算法设计与分析>总目录 相关文章: · 动态规划(一):基础知识 · 动态规划(二):钢条切割 · 动态规划(三):矩阵链乘法 · 动态规划(四):动态规划详解 · 动态规划( ...

  4. 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...

    动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...

  5. 算法设计与分析——动态规划(一)矩阵连乘

    动态规划--Dynamic programming,可以说是本人一直没有啃下的骨头,这次我就得好好来学学Dynamic programming. OK,出发! 动态规划通常是分治算法的一种特殊情况,它 ...

  6. 算法设计与分析——动态规划——数字三角形问题

    数字三角形问题 1.题目描述:给定一个由n行数字组成的数字三角形,如图3-7所示.设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 算法设计:对于给定的由n行数字组成的数字 ...

  7. 算法设计与分析—动态规划算法

    动态规划算法 1.动态规划算法基本思想 2.动态规划算法求解步骤 3. 0-1背包问题 在现实生活中,存在这样一类问题,它们的活动过程不仅可以分成若干阶段,而且在任意一个阶段(不妨设为第i个阶段)以后 ...

  8. 算法设计与分析——动态规划——矩阵连乘问题

    动态规划与分治法的异同: 相同点:其基本思想都是将待求解问题分解为若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解. 差异点:与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题 ...

  9. 算法设计与分析——动态规划——石子合并问题

    1.石子合并问题 在一个圆形操场的四周摆放着n堆石子.现要将石子有序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.设计一个算法,计算出将n堆石子合并成 ...

  10. 算法设计与分析——动态规划——01背包问题

    #include<iostream> #include<iomanip> using namespace std; //前i个物品装入容量为j的背包中获得的最大价值//0-1背 ...

最新文章

  1. maven多项目打包报错---子模块相互依赖打包时所遇到的问题:依赖的程序包找不到 package xxx does not exist
  2. 移动端以刻度或尺度滑动方式选择年龄收入等
  3. java中多态_Java中多态的理解
  4. 设计模式- 创建型模式, 建造者模式(2)
  5. F5解决方案– 教育行业解决方案1(分析篇)
  6. iis php前景,IIS下PHP的ISAPI和FastCGI比较
  7. 制作u盘winpe启动盘_系统U盘启动盘制作教程,老毛桃U盘启动装机工具帮你做
  8. ICP备案线下注销 网站域名备案注销
  9. java人民币金额大写_[求助]用java实现整数转换为人民币金额大写的功能
  10. 从动物科学到乐队鼓手,腾讯技术小哥的开源人生
  11. React全家桶详细讲解-图文并茂
  12. 有贵人相助顶你三年兢兢业业---养浩有感
  13. Linux下载ncbi的SRA文件
  14. 解决:Conda报错InvalidArchiveError
  15. ICMP拒绝服务攻击(原始套接字系列四)
  16. oracle 表空间文件达到32G后解决办法
  17. android 防止屏幕误碰,小米11带来硬件防误触解决方案,彻底解决曲面屏误触问题...
  18. 爬取拉钩 破解拉钩反爬机制
  19. python爬虫基础(二)
  20. 国家计算机技术与软件专业技术资格(水平)考试与职称有何对应关系?

热门文章

  1. 06年你看过《武林外传》吗?如果看过,就明白什么叫物是人非
  2. UE4C++开发学习笔记(01)——创建一个能操控的Character
  3. uibot和按键精灵区别_uibot和按键精灵有什么区别?
  4. Idear集成maven环境
  5. android10 psp模拟器,PPSSPP(PSP模拟器) V1.10 安卓版
  6. easyui数据表格重置_Easyui 格式化列_EasyUI 教程
  7. MySQL从删库到跑路(0):序章
  8. 看这里!有个奔向月薪7万的程序员专属规划!
  9. filp_open/filp_close/vfs_read/vfs_write
  10. 分享一点关于安装、使用达梦数据库的愚见