在做动态规划类题目时最大的感觉就是能够分析出这道题目需要用动态规划算法来解,却没有办法构建出解题步骤,看到别人的分析时候又感觉代码很简单但是自己却想不出。
其实这还是没有理解到动态规划算法的基本思想。

这里我们通过一道例题来进行分析

由于相邻房屋不能偷,如果我们从前往后思考当我们偷第一家那么我们就不能偷第二家,如果我们偷第二家我们就不能偷第三家…这时发现我们每走一步问题都为发生改变。
此时我们就应该换个角度思考从后往前看
假如我们现在有5家房屋
当我们选择偷第五家的时候,那么最大金额 = 第五家金额 + 前三家偷窃的最优解。
当我们不偷第五家的时候,那么最大金额 = 前四家偷窃的最优解。

这时候我们就能明白:如果只有一种情况时,最佳的选择应该怎么做.然后根据这个最佳选择往前一步推导,得到前一步的最佳选择。
这道题最主要的部分就是要分析出每一步的最优解然后往后递推。

我们来结合示例2进行分析:
输入为:[2,7,9,3,1]
我们使用一个dp[]数组储存我们没阶段的最优解

(1)假设起始状态下没有房屋时最优解为:0
dp[0]=0(可以看作0房屋时候的最优解)
(2)如果只存在第一家的时候那么最优解为:2
dp[1]=2(1间房屋时候的最优解)
(3)如果存在两家的时候最优解就是:7
dp[2]=7(2间房屋时候的最优解)
(4)如果存在三家的时候最优解就是:11
这里不难看出,当我们选择偷第三家的时候:
最大金额 = dp[1](前一家的最优解) + nums[2](第三家的金额)
不偷第三家的时候:
最大金额 = dp[2] (前两家的最优解)
然后我们比较这两种情况,金额最大就作为前三家的最优解

即dp[3]=11(dp[1]+nums[2] > dp[2])
(4)如果存在四家的时候最优解就是:11
dp[4]=11 (dp[2]+nums[3] < dp[3])
(5)如果存在五家的时候最优解就是:12
dp[5]=12 (dp[3]+nums[4] > dp[4])

所以我们经过分析后就能够得出状态转移方程为:
dp[n] = MAX(dp[n-2] + nums[n-1], dp[n-1])

题解代码:

class Solution {public int rob(int[] nums) {int len = nums.length;if(len == 0){return 0;}int[] dp = new int[len+1];dp[0]=0;dp[1]=nums[0];for(int i=2; i<=len; i++){dp[i] = Math.max(dp[i-2] + nums[i-1], dp[i-1]);}return dp[len];}
}

下面总结一下动态规划算法的一般思路:

  1. 把原问题分解为子问题,我的想法是跟多的自己来给出一些特殊情况来带入分析(1,子问题与原问题形式相同或类似,只是问题规模变小了,从而变简单了; 2,子问题一旦求出就要保存下来,保证每个子问题只求解一遍)
  2. 确定状态,(状态:在动规解题中,我们将和子问题相关的各个变量的一组取值,称之为一个"状态",一个状态对应一个或多个子问题所谓的在某个状态的值,这个就是状态所对应的子问题的解,所有状态的集合称为"状态空间".我的理解就是状态就是某个问题某组变量,状态空间就是该问题的所有组变量) 。这里我都看法就是通过我们上面分解的子问题来慢慢推算出这些问题中的共同点。
  3. 确定一些初始状态(边界条件)的值,我们本次的例题比较简单,实际上动态规划算法难度可能很高,有点时候要特别注意边界。
  4. 确定状态转移方程(结合前面分析最后来确定)

动态规划算法解题思路相关推荐

  1. java亲密数的解题思路,算法解题思路总结 - jjhgx的个人空间 - OSCHINA - 中文开源技术交流社区...

    算法解题思路: 细读算法要求 找到极限情况 找到临界情况,结果依赖 找到最终的结束求解点 编程实现:考虑算法的空间复杂度和时间复杂度 案例说明: 假设: 输入字符串为:s, 长度为:slen, s的第 ...

  2. 二叉树算法解题思路总结(一)

    第一步:先考虑用递归的方式解决问题,注意递归的终止条件.有的递归需要用到回溯法和全局变量 第二步:如果递归无法解决问题,考虑迭代法,具体的迭代方式参考层序遍历和非递归遍历 本篇文章只介绍第一步相关的内 ...

  3. 【README1】动态规划之解题思路

    文章目录 一:动态规划介绍 二:如何写出状态转移方程 三:动态规划框架 一:动态规划介绍 动态规划(Dynamic Programming)的问题应该让大家很是头疼,因为它只要一出现,就代表了这十有八 ...

  4. 高效 遍历 算法_一文学会回溯算法解题技巧

    (给算法爱好者加星标,修炼编程内功) 来源:码海 前言 上文我们学习了深度优先搜索和广度优先搜索,相信大家对这两者的算法有了比较清楚的认识,值得一提的,深度优先算法用到了回溯的算法思想,这个算法虽然相 ...

  5. Leetcode 621. 任务调度器 解题思路及C++实现

    方法一:贪心算法 解题思路: 使用贪心的思想,先把出现最多的任务分配了(即每隔n个单位时间分配一个任务),然后再把其它任务填上.如下图 所以需要先计算各任务出现的次数,找到出现最多的任务,程序中使用m ...

  6. 一文学会回溯算法解题技巧

    前言 上文我们学习了深度优先搜索和广度优先搜索,相信大家对这两者的算法有了比较清楚的认识,值得一提的,深度优先算法用到了回溯的算法思想,这个算法虽然相对比较简单,但很重要,在生产上广泛用在正则表达式, ...

  7. 01背包问题-动态规划算法(最简洁)

    动态规划算法: 思路:从第一个物品开始填表(m[i][j]),从左到右,从上到下 如果物品比背包容量大,即放不下,则m[i][j]=m[i-1][j] 如果物品比背包容量下,即放得下,则比较 放与不放 ...

  8. [XJTUSE 算法设计与分析] 第三章 动态规划 3.2 动态规划典型例题与解题思路(一)

    文章目录 3.2 动态规划典型例题与解题思路(一) 一.拆分类 1.矩阵连乘(极重要) 1)穷举法 2)动态规划法 3)备忘录方法 2.凸多边形最优三角剖分 ① 三角剖分的结构 ② 最优子结构性质 ③ ...

  9. 动态规划解题思路与总结(三万字)

    动态规划 前言 手把手如何写动态规划 最长路径 网格 最长上升子序列问题 求最长上升子序列 最长非严格递增子序列 至少修改多少次能将序列变为上升序列 最长公共上升子序列 分级问题 移动服务 传纸条 排 ...

最新文章

  1. linux php 指令,在 Linux 命令行中使用和执行 PHP 代码(一)
  2. 装了mysql但是服务里没有反应_Mysql安装后在服务里找不到和服务启动不起来的解决方法...
  3. linux java ocr_Linux环境如何支持使用tess4j进行ORC
  4. Raft 集群成员变更、日志压缩、客户端交互
  5. 【机器学习】一文解决样本不均衡(全)
  6. MFC窗口颜色的设置
  7. GARFIELD@03-26-2005
  8. 如何用iOS工程生成iOS模拟器包
  9. 第12章[12.2] Ext JS可编辑列Grid的全场景开发
  10. 中国双燃料(DF)发动机市场趋势报告、技术动态创新及市场预测
  11. int 转string
  12. 高可用eureka服务发现实例
  13. 基于.net平台的Windows窗体应用程序——(已附源码)学生管理系统
  14. dw2xls已升级至pb11.5
  15. 【Linux】POSIX信号量
  16. 外星人 AW3423DWF 评测
  17. 服务器解析错误_常见的域名解析错误原因及应对方法
  18. ML之SHAP:机器学习可解释性之SHAP值之理解单样本单特征预测
  19. 智能手机查看上网IP地址的多种方法
  20. android 开源 高斯模糊_Android高斯模糊你所不知道的坑

热门文章

  1. M2 MacBookAir售价是多少 M2 MacBookAir配置如何
  2. 初探 MacBook Pro 刘海屏
  3. Python程序设计——邮件处理
  4. 记录wps js 宏学习过程中积累的一些函数模板
  5. Mac OS X常用软件介绍
  6. 使用R读取并查看数据
  7. ChatGPT 大规模封号,并停止注册!
  8. 磁盘阵列是什么,主要做什么用?
  9. 2023程序员今年的一些现状
  10. 华为OD机试真题 Python 实现【最快到达医院的方法】【2023 Q1 | 100分】