滚动数组
滚动数组用于优化空间,主要应用在递推(斐波那契数列)或动态规划中(如01背包问题)。
因为递推或动规中的求解方式是到底向上的(比如:数组下标由小到大),求后面的解的时候前面的解往往已经不再需要。
因此可以重复利用前面的存储空间。
利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。
一个简单的例子:斐波那契数列
普通写法:
#include<iostream>
#include<cstdio>
using namespace std;
int Fib[25];
int fib(int n)
{
Fib[0] = 0;
Fib[1] = 1;
for(int i = 2; i <= n; ++i)
Fib[i] = Fib[i - 1] + Fib[i - 2];
return Fib[n];
}
int main()
{
int ncase, n, ans;
scanf("%d", &ncase);
while(ncase--)
{
scanf("%d", &n);
ans = fib(n);
printf("%d\n", ans);
}
return 0;
}
利用滚动数组优化后的写法:
#include<cstdio>
using namespace std;
int Fib[3];
int fib(int n)
{
Fib[1] = 0;
Fib[2] = 1;
for(int i = 2; i <= n; ++i)
{
Fib[0] = Fib[1];
Fib[1] = Fib[2];
Fib[2] = Fib[0] + Fib[1];
}
return Fib[2];
}
int main()
{
int ncase, n, ans;
scanf("%d", &ncase);
while(ncase--)
{
scanf("%d", &n);
ans = fib(n);
printf("%d\n", ans);
}
return 0;
}