动态规划与分治方法都是通过组合子问题的解来求解原问题,区别在于:分治方法将问题划分为互不相交的子问题,递归求解子问题,再将它们的解组合起来,求出原问题的解。分治算法可能反复的求解某些公共子问题,从而使效率下降,例如用分治法求第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. Java程序员转行大数据的优势

    大数据时代,中国IT环境也将面临重新洗牌,不仅仅是企业,更是程序员们转型可遇而不可求的机遇. 国内大多数大型互联网公司的程序员被称作研发工程师,但实际上国内几乎没有研发项目,只能叫做开发.开发程序员的 ...

  2. 关于mysql installer 的安装和环境变量配置

    MySQL针对不同的用户提供了2中不同的版本: MySQL Community Server:社区版.由MySQL开源社区开发者和爱好者提供技术支持,对开发者开放源代码并提供免费下载. MySQL E ...

  3. PHP敏感词替换

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  4. 【vue+axios】一个项目学会前端实现登录拦截

    原文链接:github.com 一个项目学会vue全家桶+axios实现登录.拦截.登出功能,以及利用axios的http拦截器拦截请求和响应. 前言 该项目是利用了Github 提供的persona ...

  5. Docker 备忘

    C/S架构: 客户端发出命令给服务器端(内含守护进程),守护进程执行命令后将结果传回给客户端.(可以远程访问,可以本地访问) 容器内部操作: 可写层下面都是只读的,操作时需要什么文件会被复制到可写层, ...

  6. JavaMaven【五、Maven集成Eclipse使用】

    创建Maven项目 右键->new->other(Ctrl+n)->Maven Project->quickStart(catalog) 执行指令 右键->Run As- ...

  7. 记录-Intellij Idea下以Tomcat运行Web项目时的位置问题

    今天本来准备把原来的一个Web项目导入到Idea下,之前这个项目是用eclipse写的,容器用的tomcat,首先导入前我把一些没用的配置文件都给删了,像什么.eclipse..setting什么的, ...

  8. Shell脚本grep命令

    三剑客:grep  sed  awk grep:文本行过滤工具 sed:  文本行编辑器(流编辑器) awk: 报告生成器,输出格式化 grep包含三个命令: grep egrep fgrep .他们 ...

  9. Delphi 使用数据库浏览器

    樊伟胜

  10. 【异常】Caused by: org.apache.phoenix.coprocessor.HashJoinCacheNotFoundException:

    1 详细异常 Caused by: org.apache.phoenix.coprocessor.HashJoinCacheNotFoundException: ERROR 900 (HJ01): H ...