利用在數組長度N很大的情況下能達到壓縮存儲的作用。一般還是用在DP題目和遞歸中,因為DP題目是一個自下而上的擴展過程,我們常常用到是連續的解,而每次用到的只是解集中的最后幾個解,所以以滾動數組形式能大大減少內存開支。
比如:斐波那契數列
#include<iostream> using namespace std; int main() { int i; long long d[80]; d[0]=1; d[1]=1; for(i=2;i<80;i++) { d[i]=d[i-1]+d[i-2]; } cout<<d[79]<<endl; return 0; }
上面這個循環d[i]只需要解集中的前2個解d[i-1]和d[i-2];
為了節約空間用滾動數組的方法
#include<iostream> using namespace std; int main() { int i; long long d[3]; d[0] = 1; d[1] = 1; for(i=2;i<80;i++) { d[i%3]=d[(i-1)%3]+d[(i-2)%3]; } cout<<d[79%3]<<endl; return 0; }
再比如二維數據:
int i, j, d[100][100]; for(i = 1; i < 100; i++) for(j = 0; j < 100; j++) d[i][j] = d[i - 1][j] + d[i][j - 1];
上面的d[i][j]只依賴於d[i - 1][j], d[i][j - 1];
用滾動數組:
int i, j, d[2][100]; for(i = 1; i < 100; i++) for(j = 0; j < 100; j++) d[i % 2][j] = d[(i - 1) % 2][j] + d[i % 2][j - 1];
滾動數組實際是一種節約空間的辦法,時間上沒什么優勢,比如:
一個DP,平常如果需要1000×1000的空間,其實根據DP的特點,能以2×1000的空間解決問題,並且通過滾動,獲得和1000×1000一樣的效果。
