动态规划思想轻松理解(java)

原创 2018年04月16日 11:36:49

      动态规划出现在很多算法题目里面,初学者入门并不容易,网上很多文章看了以后还是不是很理解什么的动态规划算法,就打算记录一下自己的笔记,用案例加详细说明的方式深入理解动态规划的核心思想。

      以lletcode198题目为例(抢金店),不熟悉题目的同学可以百度一下~这是一个典型的动态规划类题目。

     首先看非动态规划怎么实现:

     

public class Solution{
   public int rob(int[] nums){
      return slove(nums.length,nums);
   }
   public int slove(int idx,int[] nums){
      int max = Math.max(nums[idx]+slove(idx- 2,nums),solve(idx-1,nums));
      return max;
   }
}

     上面的代码是通常的暴力搜索解法,这个一定要理解。本质上暴力搜索都是递归问题。说到这里,大家可能会问,怎么还没提到动态规划呢?

     我们仔细看上面的代码,会发现时间复杂度很高,为什么呢?   因为有大量的重复计算!做如下分析:

               n  -> (n-2,n-3,n-4,......)         //n代表一开始抢第n家店,后面以此类推。。。

               n-1    ->(n-3,n-4,.........

    这里,大家会发现,红色划线部分的店会重复计算,我们用动态规划就是希望去除冗余计算,降低时间复杂度。

   怎么做呢?基本步骤如下:

          1)设计暴力算法,找到冗余

          2)  设计并存储状态(一维,二维,三维,甚至Map)

         3) 递归式(状态转移方程)

         4)自低向上计算最优解

    一般的动态规划算法都需要以上流程,乍一看,写的啥,看不懂是吧,下面以这个题目为例详细解读这几个步骤,第一个步骤上面代码已经完成了,下面看第二步:之说以会重复计算,是因为我们没有保存已经计算过的店家,所有我们用一个中间状态来保留计算过的店家,以此防止重复计算,完整代码如下:

          

       

public class Solution{
   public static int[] result;//记录中间态
   public int rob(int[] nums){
      result = new int[num.length-1];
      for(int i =0;i<num.length-1;i++){
            result[i] = -1;//初始化为,-1表示没有计算过
      } 
      return slove(nums.length,nums);
   }
   public int slove(int idx,int[] nums){
      if(result[ids]>=0{

                    return result[idx];//大于0,表示该位置计算过了,直接返回,该行代码很关键

      }
      int max = Math.max(nums[idx]+slove(idx- 2,nums),solve(idx-1,nums));
      return max;
   }
} 

          以上代码中,红色部分为第二部。设计了一个中间状态,好好体会吧~

         下面看第三部代码:

   max = Math.max(nums[idx]+slove(idx- 2,nums),solve(idx-1,nums));

        状态转移方程就是一个递归式。

        到这里,应该理解了动态规划的核心啦,做一个小总结:

            1)思考过程为:原问题->子问题->原问题   的过程
            2) 去冗余,空间换时间

         

       



UML参考手册 第二部分 基 本 概 念 第8章 交 互 视 图

UML参考手册  第二部分 基 本 概 念  第8章 交 互 视 图8.1 概述  对象间的相互作用体现了对象的行为。这种相互作用可以描述成两种互补的方式,一种以独立的对象为中心进行考察,另一种以互相...
  • CandyCat
  • CandyCat
  • 2001-05-26 23:02:00
  • 1324

以动态规划的思路理解Floyd算法

以动态规划的思路理解Floyd算法 本文纯粹是自己的一些想法,如果有不对的请各位大牛指教         通常,想到计算最短路径时,由于是求最优路径,多会想到DP算法,但是若是以每一个点作为一个划分,...
  • jy001227801
  • jy001227801
  • 2013-12-11 22:17:03
  • 944

深入理解Aop编程思想

Aop(Aspect-Oriented Programming,面向切面编程),可以说是oop(面向对象编程)的一个补充和完善,为啥这样说呢?我们都知道oop将我们的程序很好的用继承,封装,多态实现了...
  • u010214269
  • u010214269
  • 2015-08-08 23:19:42
  • 3181

java算法之动态规划基本思想以及具体案例

一、基本概念     动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 二、基本思想...
  • likailonghaha
  • likailonghaha
  • 2016-12-10 22:23:40
  • 5382

动态规划的思想

动态规划的思想      动态规划( dynamic programming )算法是解决多阶段决策过程最优化问题的一种常用方法,难度比较大,技巧性也很强。利用动态规划算法,可以优雅而高效地解决很多...
  • luojinping
  • luojinping
  • 2011-10-24 15:52:14
  • 3565

轻松理解AOP(面向切面编程)

Spring如此流行,当我第一次接触Spring的时候,到网上看了一些文章,都讲得神乎其乎,最后我篇也没看懂,我当时就是认为这个东西一定很高深,于是我就遇到做WEB开发的人就会打听一下。得到最多的一个...
  • yanquan345
  • yanquan345
  • 2014-02-24 20:47:59
  • 7534

动态规划——基本思想

动态规划——基本思想动态规划的特点 把原始问题划分为一系列子问题 求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时到时直接存取,不重复计算,节省计算时间 自底向上地计算 使用范围 一类优化问...
  • q547550831
  • q547550831
  • 2016-07-14 15:08:10
  • 2646

动态规划思想分析——经典题目

动态规划思想是算法设计中很重要的一个思想,所谓动态规划就是“边走边看”,前面的知道了,后面的根据前面的也就可以推出来了。和分治算法相似又不同,相同的是都需要去寻找最优子结构,重复子问题,边界条件。不同...
  • zx64881926
  • zx64881926
  • 2016-09-11 14:56:33
  • 1453

java 快速排序的思想及解释说明

快速排序在应用上很广泛,大家有知道二分法,二分法在排好序的数组中查找数据是最快的 快速排序是在无序的数组中排序、查找都是最快的 如今大数据时代,在数据量如此之大的情况下查找的速度是很重要的,那么认识快...
  • king866
  • king866
  • 2016-08-15 14:48:13
  • 2523

8张图让你轻轻松松理解Java的各种特性

这篇文章我是在其它网站看到的,感觉写的很好,图片也描述的比较形象,根据图能够非常轻松的理解JAVA的异常、集合、同步、堆栈、JVM等各种特性。 下面是转载的文章内容: 一图胜千言,下面图解均来自P...
  • Mr_Smile2014
  • Mr_Smile2014
  • 2016-06-30 14:51:22
  • 1188
收藏助手
不良信息举报
您举报文章:动态规划思想轻松理解(java)
举报原因:
原因补充:

(最多只允许输入30个字)