滚动数组~\(≧▽≦)/~
今天第一次用了滚动数组,缘由要从一道题说起:POJ 1159 Palindrome
题意:给你一个字符串,求对字符串最少添加几个字符可变为回文串。
分析: 简单做法是直接对它和它的逆序串求最长公共子序列长度len。n-len即为所求。至于为什么,小盆友们可以自己模拟一下下。O(∩_∩)O~因为这不是我们今天讲的重点~噶呜
很明显这是一道LCS题,如果你还不知道什么是LCS,可以点击 LCS ,我们都知道要开辟一个dp[5001][5001]的数组来存LCS值,问题来了,当我开心的交上代码的时候竟然
内存超限了~!!看了下讨论组,说改成short int 能过,果然过了,但是memory==49156.。。太大了。上网一搜,发现了滚动数组这个东西,memory立即编程188K。啥都不说了,进入正题!
滚动数组的作用在于优化空间,主要应用在递推或动态规划中(如01背包问题)。因为DP题目是一个自底向上的扩展过程,我们常常需要用到的是连续的解,前面的解往往可以
舍去。所以用滚动数组优化是很有效的。利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。
一个DP,如果需要1000×1000的空间,其实根据DP的无后效性,可以开成2×1000,然后通过滚动,获得和1000×1000一样的效果。
滚动数组常用于DP之中,在DP过程中,我们在由一个状态转向另一个状态时,很可能之前存储的某些状态信息就已经无用了,例如在01背包问题中,从理解角度讲我们应开
DP[i][j]的二维数组,第一维我们存处理到第几个物品,也就是阶段了,第二维存储容量,但是我们获得DP[i],只需使用DP[i - 1]的信息,DP[i - k],k>1都成了无用空间,因此我们
可以将数组开成一维就行,迭代更新数组中内容,滚动数组也是这个原理,目的也一样,不过这时候的问题常常是不可能缩成一维的了,比如一个DP[i][j]需要由DP[i - 1 ][k],
DP[i - 2][k]决定,i<n,0<k<=10;n <=100000000;显然缩不成一维,正常我们应该开一个DP[100000005][11]的数组,结果很明显,超内存,其实我们只要开DP[3][11]
就够了DP[i%3][j]由DP[(i - 1)%3][k]和DP[(i - 2)%3][k]决定,空间复杂度差别巨大。
学以致用:http://poj.org/problem?id=1159 小盆友们快去做一做吧~噶呜~
转载于:https://www.cnblogs.com/PJQOOO/p/3900677.html
滚动数组~\(≧▽≦)/~相关推荐
- 洛谷 P2679 子串 【dp神题】【滚动数组】【2015 noip d2t2】
偷个懒,题解看这里:https://www.luogu.org/problemnew/solution/P2679 看作者 GuessYCB 写的 ===2018.9.6=== 这一次算理解深一点了 ...
- 高级打字机【主席树】【滚动数组】【块状链表】
题目大意: 一个计算机支持一下三中操作: TT xx:在文章末尾打下一个小写字母xx. UU xx:撤销最后的xx次修改操作. QQ xx:询问当前文章中第xx个字母并输出. InputInput 7 ...
- 《滚动数组》---滚动数组思想,运用在动态规划当中
滚动数组是DP中的一种编程思想.简单的理解就是让数组滚动起来,每次都使用固定的几个存储空间,来达到压缩,节省存储空间的作用.起到优化空间,主要应用在递推或动态规划中(如01背包问题).因为DP题目是一 ...
- hdu 1024(滚动数组优化)
本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题. 解题思路:dp[i][j]表示前j个数分成i组,且j在第i组里的最大值. dp[i][j] = max{dp[i][j-1]+a[ ...
- HDU 1176 免费馅饼 矩阵取数, dp + 滚动数组
http://acm.hdu.edu.cn/showproblem.php?pid=1176 首先可以处理出整张地图的状态. book[T][POS]表示第T秒,在第pos个地方有多少个馅饼. dp[ ...
- Gym 100507G The Debut Album (滚动数组dp)
The Debut Album 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/G Description Pop-group & ...
- 动态规划 0-1背包问题 滚动数组
定义 dp[j]是从物品0到i中挑选物品,放进容量为j的背包中的最大价值总和. 初始化 int dp[maxn]; memset(dp, sizeof(dp), -0x3f3f3f3f); 一维滚动数 ...
- Top Secret Task(dp+滚动数组)
传送门: 题目 dp[i][j][k] 表示 考虑到第i个数 计算前j个数的和 进行了k次操作 则有 若不把第i个数放入前j个数中 dp[i][j][k] = dp[i-1][j][k] 若把第i个数 ...
- HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化
给定n个数字,求其中m段的最大值(段与段之间不用连续,但是一段中要连续) 例如:2 5 1 -2 2 3 -1五个数字中选2个,选择1和2 3这两段. dp[i][j]从前j个数字中选择i段,然后根据 ...
最新文章
- 深入理解计算机系统答案2.11,深入理解计算机系统 第十一章
- Win32字符串处理函数
- 运行mapreduce程序yarn的web端显示进度
- 河北大学计算机复试题,2016年河北大学综合卷计算机科学与技术学院之数据库系统概论复试笔试最后押题五套卷...
- 广州站长沙龙 MIP 问题及答案
- 查询空缺_携程旅行2021校招开启,9大类职位,1000+岗位空缺,本科及以上学历...
- thinkphp-session与cookie
- 【转】C语言中的符号优先级
- 利用StringUtils工具类进行String为空的判断
- Repeater双重绑定(子菜单前台代码:)
- 智能优化算法:晶体结构算法-附代码
- zebra 的Thread机制 -- 003
- 在线类图各种UML图分享
- win 7计算机图标变了,Win7美化攻略:替换imageres.dll,图标全变样
- 英语水平测试项目(黄军威、殷乐乐、张益维20180531)
- 自定义下拉回弹View-掌握View冲突处理
- 点乘/内积/数量积;叉乘/向量积;矩阵乘法;哈达马积;克罗内克积;卷积
- 服务器声卡如何虚拟,服务器没声卡远程桌面连接怎么实现听到服务器的声音
- android椭圆进度,Android 圆形进度条
- Python实现文件上传和下载