动态规划与分治方法都是通过组合子问题的解来求解原问题,区别在于:分治方法将问题划分为互不相交的子问题,递归求解子问题,再将它们的解组合起来,求出原问题的解。分治算法可能反复的求解某些公共子问题,从而使效率下降,例如用分治法求第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
      著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public class Solution {
public int MaxSubArray(int[] nums) {
if(nums.Length<)
return ;
int sum=,Max=nums[];
for(int i=;i<nums.Length;++i)
{
if(sum<)
sum=nums[i];
else
sum+=nums[i];
Max=Max<sum?sum:Max;
}
return Max;
}
}

思路:从第一个元素开始遍历,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
  著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public class Solution {
public int Rob(int[] nums)
{
int dp=;
int sum=;
for (int i = ; i < nums.Length; i++)
{
int tmp=dp;
dp=Math.Max(sum+nums[i],dp);
sum=tmp;
}
return dp;
}
}

思路:自底向上法,由于每一个元素都是正整数,则长度为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. 怎样理解 instanceof

    instanceof 运算符用来判断一个对象在其原型链中是否存在一个构造函数的 prototype 属性. 也就是说, instanceof 判断的实际上是某个对象是否为某个构造函数的实例, 因为es ...

  2. eclipse 创建Java web项目 Cannot change version of project facet Dynamic web module to xxx

    问题描述: 用Eclipse创建Java web项目时选择的Artifact Id为maven-artchetype-webapp,由于这个archetype比较老,用的servlet还是2.3的. ...

  3. C#中判断文件夹或文件是否存在的方法

    一.根据虚拟路径获取文件物理路径: string savePath = Server.MapPath("~/Uploads/RemoteDatum/"); 二.判断文件夹是否存在 ...

  4. 【原创】大叔经验分享(74)nginx对静态文件加速

    通过location配置 location ~ \.html$ { add_header 'Cache-Control' 'no-cache'; } location ~ \.(js|css|gif| ...

  5. 搭建自己的框架WedeNet(五)

    WedeNet2018.WedeWcfServices-WCF服务层:结构如下: 就是定义了服务契约接口和服务类,以OrderServices为例,如下: using System; using Sy ...

  6. [转载]为什么用Java开发桌面程序的比较少

    这个是本人这几天用javafx开发桌面程序时候想到的,因为虽然javafx比C#之类的确实坑多不少,但是习惯了之后也还行,而且它的一次编译.各处使用真的深得我心.但为什么不流行呢: 作者:bell 来 ...

  7. Java 里 如何使用Base64,网上都是废物的说法

    百度搜索Java里如何使用Base64,结果很多文章都是让引用第三方Jar包,我靠我想了一下 他妈的Java里连这个都不提供,就直接忽略里那些废物的文章.继续搜索,算是找到答案: Java8以后 官方 ...

  8. 10 select、poll以及epoll

    IO复用:为了解释这个名词,首先来理解下复用这个概念,复用也就是共用的意思,这样理解还是有些抽象,为此,咱们来理解下复用在通信领域的使用, 在通信领域中为了充分利用网络连接的物理介质,往往在同一条网络 ...

  9. itertools:处理可迭代对象的模块

    合并和分解迭代器 chain chain可以接收多个可迭代对象(或者迭代器)作为参数,最后返回一个迭代器. 它会生成所有输入迭代器的内容,就好像这些内容来自一个迭代器一样. 类似于collection ...

  10. YII2-按需加载并管理静态资源(CSS,JS)

    参考博客: https://segmentfault.com/a/1190000003742452#articleHeader5