我们先来看个著名数列:
斐波那契数列
已知序列1,1,2,3,5,···求序列第x位为多少;
朴素做法就是:a[x]=a[x-1]+a[x-2];
如果是按上面的做法,空间大小可能会很大了,然而对于第x个数字,我们只需要知道x-1和x-2就可以了于是我们这里就引入滚动数组优化。
什么是滚动数组?
滚动数组就是根据数组的特点(一般是对成品代码进行修改)进行空间压缩,虽然没有时间上的优化,但在空间上的优化非常的明显。
对于dp一类的题目,不存在后效性,所以一般前面算好的值就会固定封存,对于当前的状态只需要前面的几个值就可以了,而其他的值也就可以舍去。所以用滚动数组优化很有优势。对于递归一类的题目(例如斐波那契)也是适用的,道理同上。
滚动数组怎么用?
举个栗子:关于斐波那契数列的代码滚动优化,我们就可以写成 a[i%3]=a[(i-1)%3]+a[(i-2)%3];
Q1:为什么要用mod
(待定)
Q2:为什么是mod3
其实这里有几个变量就mod几个就可以了
注意滚动数组一次性只能优化一维
我们以最长上升子序列例:
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
if (a[j]==k) f[i][j]=f[i-1][j-1]+1;
else f[i][j]=max(f[i-1][j],f[i][j-1]);
对于f[i][j]可以讲f[i]给优化掉,变为f[i%2]以及f[(i-1)%2],然而如果f[i][j]中的后一维被优化掉,则会丢失前面记录的信息。所以在滚动数组里面,为了保证信息的完整性,我们只优化一维。