动态规划与分治方法都是通过组合子问题的解来求解原问题,区别在于:分治方法将问题划分为互不相交的子问题,递归求解子问题,再将它们的解组合起来,求出原问题的解。分治算法可能反复的求解某些公共子问题,从而使效率下降,例如用分治法求第n个斐波那契数。动态规划算法对每个子问题只求解一次,将其解保存在一个表格中,从而无需反复求解公共子问题。动态规划通常用来求解最优化问题。

应用动态规划方法求解的最优化问题应该具备两个要素

  1、最优子结构,如果一个问题的最优解包含其子问题的最优解,我们就称此问题具有最优子结构性质

  2、子问题重叠,如果递归算法反复求解相同的子问题,我们就称最优化问题具有重叠子问题性质。

通常采用4个步骤来设计一个动态规划算法:

  1、刻画一个最优解的结构特征。

  2、递归的定义最优解的值。

  3、计算最优解的值,通常采用自底向上的方法。

  4、利用计算出的信息构造一个最优解。

动态规划的两种实现方法

  1、带备忘录的自顶向下法:执行过程中会保存每个子问题的解。当需要一个子问题的解时,首先检查是否已经保存过此问题的解。如果是,则直接返回保存的值,从而节省计算时间;否则,按通常的方法计算这个子问题

  2、自底向上法:将子问题按规模进行排序,按由小到大的顺序进行求解。当求解某个子问题时,其子问题已经求解完毕。

  两种方法得到的算法具有相同的渐进运行时间。由于没有频繁的递归函数调用的开销,自底向上方法的时间复杂性函数通常具有更小的系数。

(注:以上来自于《算法导论·第三版》第15章动态规划)

例:

  1、(来源:LeetCode)给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    示例:输入: [-2,1,-3,4,-1,2,1,-5,4],

      输出: 6
      解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

      来源:力扣(LeetCode)
      链接:https://leetcode-cn.com/problems/maximum-subarray
      著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. public class Solution {
  2. public int MaxSubArray(int[] nums) {
  3. if(nums.Length<)
  4. return ;
  5. int sum=,Max=nums[];
  6. for(int i=;i<nums.Length;++i)
  7. {
  8. if(sum<)
  9. sum=nums[i];
  10. else
  11. sum+=nums[i];
  12. Max=Max<sum?sum:Max;
  13. }
  14. return Max;
  15. }
  16. }

思路:从第一个元素开始遍历,Max记录从第一个元素到当前元素的具有最大和的连续子数组的和(自底向上法)。

  2、(来源:LeetCode)你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

  给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

  示例 1: 输入: [1,2,3,1]

     输出: 4
  解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。
  示例 2:

  输入: [2,7,9,3,1]
  输出: 12
  解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

  来源:力扣(LeetCode)
  链接:https://leetcode-cn.com/problems/house-robber
  著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. public class Solution {
  2. public int Rob(int[] nums)
  3. {
  4. int dp=;
  5. int sum=;
  6. for (int i = ; i < nums.Length; i++)
  7. {
  8. int tmp=dp;
  9. dp=Math.Max(sum+nums[i],dp);
  10. sum=tmp;
  11. }
  12. return dp;
  13. }
  14. }

思路:自底向上法,由于每一个元素都是正整数,则长度为n的数组,最优解的结构为nums[n]+(n-2)>(n-1):nums[n]+(n-2)?(n-1),(n-2) ,(n-1)代表n-2和n-1的最优解。dp记录当前元素下的最优解,sum记录前一个元素的最优解

[笔记]动态规划(dynamic programming)的更多相关文章

  1. 动态规划Dynamic Programming

    动态规划Dynamic Programming code教你做人:DP其实不算是一种算法,而是一种思想/思路,分阶段决策的思路 理解动态规划: 递归与动态规划的联系与区别 -> 记忆化搜索 -& ...

  2. 6专题总结-动态规划dynamic programming

    专题6--动态规划 1.动态规划基础知识 什么情况下可能是动态规划?满足下面三个条件之一:1. Maximum/Minimum -- 最大最小,最长,最短:写程序一般有max/min.2. Yes/N ...

  3. 动态规划(Dynamic Programming)算法与LC实例的理解

    动态规划(Dynamic Programming)算法与LC实例的理解 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Le ...

  4. 动态规划 Dynamic Programming 学习笔记

    文章以 CC-BY-SA 方式共享,此说明高于本站内其他说明. 本文尚未完工,但内容足够丰富,故提前发布. 内容包含大量 \(\LaTeX\) 公式,渲染可能需要一些时间,请耐心等待渲染(约 5s). ...

  5. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  6. [算法]动态规划(Dynamic programming)

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4603173.html Dynamic Programming的Programming指的不是程序而是一种表格 ...

  7. 最优化问题 Optimization Problems & 动态规划 Dynamic Programming

    2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题( ...

  8. 动态规划系列(零)—— 动态规划(Dynamic Programming)总结

    动态规划三要素:重叠⼦问题.最优⼦结构.状态转移⽅程. 动态规划的三个需要明确的点就是「状态」「选择」和「base case」,对应着回溯算法中走过的「路径」,当前的「选择列表」和「结束条件」. 某种 ...

  9. Python算法之动态规划(Dynamic Programming)解析:二维矩阵中的醉汉(魔改版leetcode出界的路径数)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_168 现在很多互联网企业学聪明了,知道应聘者有目的性的刷Leetcode原题,用来应付算法题面试,所以开始对这些题进行" ...

随机推荐

  1. charles 抓包 (一)

    在web.app开发中经常需要通过抓包来定位页面.接口返回数据的问题.在mac系统中,charles是一款功能丰富的抓包软件.可以实现app的数据抓包. 工具:charles 附送charles的破解 ...

  2. java lesson15Homework

    package lesson15; /** * 1. 使用ArrayList存储整型元素,并对元素进行升序输出 */ import java.util.ArrayList; import java.u ...

  3. centos 7 firewall(防火墙)开放端口/删除端口/查看端口

    1.firewall的基本启动/停止/重启命令 复制#centos7启动防火墙 systemctl start firewalld.service #centos7停止防火墙/关闭防火墙 system ...

  4. JavaJDBC【七、JDBC升级版简介】

    Commons-dbutils Apache提供的一个开源JDBC工具类库,对传统操作数据库的类进行二次封装,可以把结果集转换成List. 特点: 1.杜绝资源泄漏 2.简化代码 3.以Bean实例形 ...

  5. 学习--Spring IOC源码精读

    Spring核心IOC的源码分析(转载) 原文地址:https://javadoop.com/post/spring-ioc#toc11 转载地址:https://blog.csdn.net/nuom ...

  6. SSH安装配置

    一.环境准备 二.SSH配置 1.root用户进入home目录,确实有无隐藏文件夹 .ssh cd ~ ls -lrta 2.有,则跳过本步骤:没有,执行如下命令 ##根据提示输入当前用户密码 ssh ...

  7. SQL语句复习【专题四】

    SQL语句复习[专题四] 多表查询 sql 92多表查询 sql92.sql99 标准--查询所有员工的姓名,部门编号,部门名称select * from empselect * from dept- ...

  8. SQL 语句外键 a foreign key constraint fails

    queryRunner.update("SET FOREIGN_KEY_CHECKS = 0;"); queryRunner.update(sql, pid); queryRunn ...

  9. Java 工具类 IpUtil - 获取本机所有 IP 地址,LocalHost 对应地址 IP

    Java 工具类 IpUtil - 获取本机所有 IP 地址,LocalHost 对应地址 IP IP 工具类 源代码: /** * <p> * * @author XiaoPengwei ...

  10. WebRTC的带宽估计[转载]

    带宽估计(BWE)模块的任务是决定你可以发送多大的视频流且不会造成网络拥塞,以此来保证不会降低视频质量. 在以前的带宽估计算法还是十分基础的,大体上是基于丢包而设计的.通常我们在开始慢慢的增加视频的比 ...