动态规划之空间压缩技巧
不管是哪个动态规划,如果依赖的只是相邻位置,那么就可以使用空间压缩方法。
情况一:
(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 列的值,然后按照依赖关系推导其他普遍位置,是完全可以的。
总结来说就是看如果行比较小,则一列一列地更新;如果列比较小,就一行一行地更新。
动态规划之空间压缩技巧相关推荐
- 【中等】龙与地下城游戏问题-Java:经典动态规划结合空间压缩解法
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程 package live.every.day.ProgrammingDesign.Codi ...
- 背包问题算法实现(全组合、暴力递归、动态规划及空间压缩、对数器)
背包问题的实现 * 1.全组合解法(对数器) * 2.暴力递归解法 * 3.动态规划解法 * 4.动态规划(省空间)解法 对数器的思路是:求解n个物品的全组合中不超过背包容量的组合对应的最大价值(时间 ...
- [算法入门笔记] 18. 动态规划
动态规划往往是有套路的,但套路是建立在熟练的基础上的~ 文章目录 0 建议 1 机器人达到指定位置的方法数 1.1 暴力递归 1.2 记忆化搜索 1.3 动态规划 2 换钱的最少货币数 2.1 暴力递 ...
- 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',可以让 ...
- 左神数据结构与算法(中级提升)——02
题目十一:二叉树递归套路 二叉树的每个节点都有一个int型权值,给定一棵二叉树,要求计算出从根节点到叶节点的所有路径中,权值和 最大的值为多少. package class02;public clas ...
- LeetCode 题解随笔:动态规划(一)
目录 零.前言 一.基础题目 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯[*] 62. 不同路径 63. 不同路径 II 343. 整数拆分[*] 96. 不同的二 ...
- 关于“labuladong的算法小抄”的学习笔记---第0章核心框架汇总的后半部分技巧(c++版)
目录 前言 一.回溯算法秒杀所有排列/组合/子集问题 回溯和DFS之间区别---遍历树枝or遍历节点 1.子集(元素无重不可复选) 2.组合(元素无重不可复选) 3.排列(元素无重不可复选) 4.子集 ...
- vb treeview 展开子节点_详解最长公共子序列问题,秒杀三道动态规划题目
学算法认准 labuladong 后台回复进群一起力扣? 读完本文,可以去力扣解决如下题目: 1143.最长公共子序列(Medium) 583. 两个字符串的删除操作(Medium) 712.两个字符 ...
- 动态规划C++实现--换钱的方法数(二)(动态规划及其改进方法)
题目:换钱的方法数 给定数组 arr, arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法. 将原文的伪代 ...
最新文章
- 我猜你不知道知乎这么个大系统是咋部署的!
- 查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号
- 【Android工具】更新WPS全功能正版授权无广告版
- learn at ease
- lucene3.5学习笔记03--待续
- arcgis的numpy模块_01. Numpy模块
- EF 数据库连接约定(Connection String Conventions in Code First)
- automake生成静态库文件_gcc编译工具生成动态库和静态库之一----介绍
- BZOJ 1066 蜥蜴 最大流
- 软件工程学习之七大实际开发模型的讲解,及模块化设计的理念
- 8个按键控制8个继电器c语言程序,单片机C语言程序的设计实训100例.doc
- 地图编辑器怎样炼成的
- Android studio 设置背景图
- tensorflow笔记-文本情感分类
- minigui 编译与使用
- 文件夹访问被拒绝 你需要权限来执行此操作,你需要来自SYSTEM的权限才能对此文件夹进行更改
- LeetCode刷题(45)~位1的个数【布赖恩·克尼根算法】
- 小饭桌沙盘演戏商战-老友记成长
- 基于lnmp环境配置wordpress,以及403 Forbidden错误解决
- 1064 例题5-1-5 连续自然数求和
热门文章
- form表单的serialize,serializeObject,serializeArray属性
- unity 处理物体或图片渐变效果
- fopen和fclose函数的使用
- KEPServerEX 6.12.325.0 发布说明
- Android自定义View进阶-MotionEvent详解
- matlab 不用phantom,2dshepp-logan模型matlab代码 不要用phantom函数
- ElasticSearch - 全文检索服务 - RestHightLevel版
- AutoLisp从入门到放弃(七)
- [siggraph19]《荒野大镖客2》的大气云雾技术(1/4)
- 重庆农业银行商贷转公积金流程