【滚动数组】 可以想象成显示屏,对于有很多的数字来说,每次只显示有限的数字,用完(显示完)就向后移动一位,显示的数量不变,但是在卡内存比较紧的题中,可以节省很多空间。
最典型的就是斐波那契数列,普通的求解方法不外乎就是用递推式f[i]=f[i-1]+f[i-2],但是这个如果数据量大的话会爆内存,而用滚动数组的方法可以用3个单位大小的空间求得解,这样就节省了很多的空间。
斐波那契数列普通解法:
#include<iostream>
#include<cstdio>
using namespace std;
int f[100];
int ff(int n)
{
f[0] = 0;
f[1] = 1;
f[2] = 1;
for(int i = 3; i <= n; ++i)
f[i] = f[i - 1] + f[i - 2];
return f[n];
}
int main()
{
int t, n;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
printf("%d\n", ff(n));
}
return 0;
}
滚动数组解法:
#include<cstdio>
using namespace std;
int f[3];
int ff(int n)
{
f[1] = 0;
f[2] = 1;
for(int i = 2; i <= n; ++i)
{
f[0] = f[1];
f[1] = f[2];
f[2] = f[0] + f[1];
}
return f[2];
}
int main()
{
int t, n;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
printf("%d\n", ff(n));
}
return 0;
}
这样解释就很明白了,滚动数组一般在DP题和状态压缩算法方面用的多,而且优化后效率很高,推荐使用。