說來慚愧,我老早以前就學習了dp,可直到最近才知道滾動數組。
所以說,滾動數組是什么呢?
它是一種優化dp空間復雜度的思想。
在dp轉移時,我們往往不需要之前推的所有的,而是只需要前一兩個轉移的。
我們以斐波那契數列為例,代碼如下:
for(int i=2;i<100;i++) { d[i]=d[i-1]+d[i-2] }
printf("%d",d[99]);
可以發現,如果求解99位,那么需要使用將近快100個存儲單元。
如果求解位數更多,那么空間就爆了。
那用滾動數組怎么優化呢?
for(int i=2;i<100;i++) { d[i%3]=d[(i-1)%3]+d[(i-2)%3]; } printf("%d",d[99%3]);
這里無論求多少個,只需要留出三個存儲單元的位置即可。
可以發現,空間優化了很多,但時間沒有優化,甚至會更差。
而且,滾動數組還會覆蓋之前的解,所以不是所有dp都能這么優化。