在DP中使用 滾動陣列

2021-06-16 11:29:46 字數 1020 閱讀 6630

舉個簡單的例子:

int d=new int[100];

d[0]=1;d[1]=1;

for(int i=2;i<100;i++)

d[i]=d[i-1]+d[i-2];

system.out.printf("%d",d[99]);

上面這個迴圈d[i]只需要解集中的前2個解d[i-1]和d[i-2];

為了節約空間用滾動陣列的方法

int d=new int[3];

d[0]=1;d[1]=1;

for(int i=2;i<100;i++)

d[i%3]=d[(i-1)%3]+d[(i-2)%3];

system.out.printf("%d",d[99%3]);

注意上面的運算,我們只留了最近的3個解,陣列好象在「滾動一樣,所以叫滾動陣列

對於二維陣列也可以用這種方法 例如:

int d=new int[100][100];

for(int i=1;i<100;i++)

for(int 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 d=new int[2][100];

for(int i=1;i<100;i++)

for(int j=0;j<100;j++)

d[i%2][j]=d[(i-1)%2][j]+d[i%2][j-1];

滾動陣列實際是一種節約空間的辦法,時間上沒什麼優勢,多用於dp中, 乙個dp,平常如果需要1000×1000的空間,其實根據dp的特點,能以2×1000的空間解決問題, 並且通過滾動,獲得和1000×1000一樣的效果。

在CScrollView中使用滾動條

近日需要在mfc中的mdi中使用帶滾動條的檢視。找了許久發現其實很簡單 1 用基類 cscrollview 生成新檢視 cnewview 2 修改mfc自動生的 cnewview oninitialupdate 原內容為 void cnewview oninitialupdate cscrollvi...

DP與滾動陣列

滾動陣列的作用在於優化空間,主要應用在遞推或動態規劃中 如01揹包問題 因為dp題目是乙個自底向上的擴充套件過程,我們常常需要用到的是連續的解,前面的解往往可以捨去。所以用滾動陣列優化是很有效的。利用滾動陣列的話在n很大的情況下可以達到壓縮儲存的作用。乙個簡單的例子 斐波那契數列 一般 cpp vi...

在NumPy中使用動態陣列

本文 numpy的ndarray陣列物件不能像list一樣動態地改變其大小,在做資料採集時很不方便。本文介紹如何通過np.frombuffer 實現動態陣列。python的列表物件實際上是乙個動態指標陣列。當列表中沒有空間儲存新的元素時,列表會動態地改變其大小,以容納新的元素。每次改變大小時,它都會...