不管是哪个动态规划,如果依赖的只是相邻位置,那么就可以使用空间压缩方法。

  • 情况一:(i,j) 位置依赖于 (i-1,j)(i,j-1),则从左往右 求 (题目"动态规划:路径最小累加和(经典)" 即使用的这种压缩技巧)

  • 情况二:(i,j) 位置依赖于 (i-1,j-1)(i-1,j),则从右往左 求
    如果某个动态规划中的某个位置依赖左上角的值和正上方的值,也能做数组压缩。

    这种情况的第0行都能由自身得到,因为第0行没有左上角和上方位置,类似于base case,其他位置就 从右往左 求,值没有更新的时候代表上一行的值,更新后代表这一行的值。

不管什么动态规划问题,只要满足这种依赖关系,都可以进行数组压缩。

  • 情况三:(i,j) 位置依赖于(i-1,j-1)(i-1,j)(i,j-1),增加一个临时变量,并从左往右求

    第 0 行的值都能通过0行左边的值得到,因为第 0 行没有左上角和正上方。第 0 列的值通过第0列的上方的值得到,因为该列没有左边和左上角的值。

    假设第0行arr[a, b, c],那么第1行的第0列的值a'可以通过a 得到,但是在将a' 填回该一维数组之前,用一个变量t记录下原始的a,此时一维数组中的值为[a',b,c],而t = a,则b' 位置依赖的三个位置的值都已经得到了:

如果脑海中的 dp 表是 n(行) * m(列) 大小的,就需要准备一个 m 个元素空间的数组,这种情况下,如果 100w * 4,那只需要一个长度为 4 的数组即可,执行100w次,竖向更新,很好;但是如果是 4 * 100w 的矩阵呢?仍然只需要准备一个长度为 4 的数组,横向更新(如下图所示)。

这种推导方式和上文描述的一样,可以先得到第 0 列的值,通过第 0 列推导出第 1 列的值,然后按照依赖关系推导其他普遍位置,是完全可以的。

总结来说就是看如果行比较小,则一列一列地更新;如果列比较小,就一行一行地更新。

动态规划之空间压缩技巧相关推荐

  1. 【中等】龙与地下城游戏问题-Java:经典动态规划结合空间压缩解法

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程 package live.every.day.ProgrammingDesign.Codi ...

  2. 背包问题算法实现(全组合、暴力递归、动态规划及空间压缩、对数器)

    背包问题的实现 * 1.全组合解法(对数器) * 2.暴力递归解法 * 3.动态规划解法 * 4.动态规划(省空间)解法 对数器的思路是:求解n个物品的全组合中不超过背包容量的组合对应的最大价值(时间 ...

  3. [算法入门笔记] 18. 动态规划

    动态规划往往是有套路的,但套路是建立在熟练的基础上的~ 文章目录 0 建议 1 机器人达到指定位置的方法数 1.1 暴力递归 1.2 记忆化搜索 1.3 动态规划 2 换钱的最少货币数 2.1 暴力递 ...

  4. leetcode(494/3/53/135/97/72/772/11/301/300/45/517/1643/146/42/407)面试题08.14~剑指offer62

    目录 题目1:给定一个有序数组arr,代表坐落在X轴上的点,给定一个正数K,代表绳子的长度.返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住. 题目2:一个数组中只有俩个字符'G'和'B',可以让 ...

  5. 左神数据结构与算法(中级提升)——02

    题目十一:二叉树递归套路 二叉树的每个节点都有一个int型权值,给定一棵二叉树,要求计算出从根节点到叶节点的所有路径中,权值和 最大的值为多少. package class02;public clas ...

  6. LeetCode 题解随笔:动态规划(一)

    目录 零.前言 一.基础题目 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯[*] 62. 不同路径 63. 不同路径 II 343. 整数拆分[*]​​​​​​ 96. 不同的二 ...

  7. 关于“labuladong的算法小抄”的学习笔记---第0章核心框架汇总的后半部分技巧(c++版)

    目录 前言 一.回溯算法秒杀所有排列/组合/子集问题 回溯和DFS之间区别---遍历树枝or遍历节点 1.子集(元素无重不可复选) 2.组合(元素无重不可复选) 3.排列(元素无重不可复选) 4.子集 ...

  8. vb treeview 展开子节点_详解最长公共子序列问题,秒杀三道动态规划题目

    学算法认准 labuladong 后台回复进群一起力扣? 读完本文,可以去力扣解决如下题目: 1143.最长公共子序列(Medium) 583. 两个字符串的删除操作(Medium) 712.两个字符 ...

  9. 动态规划C++实现--换钱的方法数(二)(动态规划及其改进方法)

    题目:换钱的方法数 给定数组 arr, arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法. 将原文的伪代 ...

最新文章

  1. 我猜你不知道知乎这么个大系统是咋部署的!
  2. 查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号
  3. 【Android工具】更新WPS全功能正版授权无广告版
  4. learn at ease
  5. lucene3.5学习笔记03--待续
  6. arcgis的numpy模块_01. Numpy模块
  7. EF 数据库连接约定(Connection String Conventions in Code First)
  8. automake生成静态库文件_gcc编译工具生成动态库和静态库之一----介绍
  9. BZOJ 1066 蜥蜴 最大流
  10. 软件工程学习之七大实际开发模型的讲解,及模块化设计的理念
  11. 8个按键控制8个继电器c语言程序,单片机C语言程序的设计实训100例.doc
  12. 地图编辑器怎样炼成的
  13. Android studio 设置背景图
  14. tensorflow笔记-文本情感分类
  15. minigui 编译与使用
  16. 文件夹访问被拒绝 你需要权限来执行此操作,你需要来自SYSTEM的权限才能对此文件夹进行更改
  17. LeetCode刷题(45)~位1的个数【布赖恩·克尼根算法】
  18. 小饭桌沙盘演戏商战-老友记成长
  19. 基于lnmp环境配置wordpress,以及403 Forbidden错误解决
  20. 1064 例题5-1-5 连续自然数求和

热门文章

  1. form表单的serialize,serializeObject,serializeArray属性
  2. unity 处理物体或图片渐变效果
  3. fopen和fclose函数的使用
  4. KEPServerEX 6.12.325.0 发布说明
  5. Android自定义View进阶-MotionEvent详解
  6. matlab 不用phantom,2dshepp-logan模型matlab代码 不要用phantom函数
  7. ElasticSearch - 全文检索服务 - RestHightLevel版
  8. AutoLisp从入门到放弃(七)
  9. [siggraph19]《荒野大镖客2》的大气云雾技术(1/4)
  10. 重庆农业银行商贷转公积金流程