滾動數組是DP中的一種編程思想。簡單的理解就是讓數組滾動起來,每次都使用固定的幾個存儲空間,來達到壓縮,節省存儲空間的作用。起到優化空間,主要應用在遞推或動態規划中(如01背包問題)。因為DP題目是一個自底向上的擴展過程,我們常常需要用到的是連續的解,前面的解往往可以舍去。所以用滾動數組優化是很有效的。利用滾動數組的話在N很大的情況下可以達到壓縮存儲的作用。
當然是用時間去換空間的
在斐波那契數列中
#include<bits/stdc++.h>
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];
}
printf("%lld\n",d[79]);
return 0;
}
上面這個循環d[i]只依賴於前兩個數據d[i - 1]和d[i - 2]; 為了節約空間用滾動數組的做法,可以將整個dp數組壓縮成dp[3]
#include<bits/stdc++.h>
int main()
{
int i;
long long d[3];
d[1]=1;
d[2]=1;
for(i=2;i<80;i++)
{
d[0]=d[1];
d[1]=d[2];
d[2]=d[0]+d[1];
}
printf("%lld\n",d[2]);
return 0;
}
滾動數組在DP中能起很大作用尤其是當原本需要申請得內存大小很大得情況下