DP與滾動陣列

2021-07-11 19:11:23 字數 1274 閱讀 2756

**:

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

乙個簡單的例子:

斐波那契數列:

一般**:

[cpp]view plain

copy

#include

#include

using

namespace

std;  

intfib[25];  

intfib(

intn)  

intmain()  

return

0;  

}  

利用滾動陣列優化後**為:

[cpp]view plain

copy

#include

using

namespace

std;  

intfib[3];  

intfib(

intn)  

return

fib[2];  

}  int

main()  

return

0;  

}          

滾動陣列實際是一種節省空間的辦法,時間上沒啥優勢,多用於dp中,舉個例子吧: 

乙個dp,平常如果需要1000×1000的空間,其實根據dp的無後效性,可以開成2×1000,然後通過滾動,獲得和1000×1000一樣的效果。滾動陣列常用於dp之中,在dp過程中,我們在由乙個狀態轉向另乙個狀態時,很可能之前儲存的某些狀態資訊就已經無用了,例如在01揹包問題中,從理解角度講我們應開dp[i][j]的二維陣列,第一維我們存處理到第幾個物品,也就是階段了,第二維儲存容量,但是我們獲得dp[i],只需使用dp[i - 1]的資訊,dp[i - k],k>1都成了無用空間,因此我們可以將陣列開成一維就行,迭代更新陣列中內容,滾動陣列也是這個原理,目的也一樣,不過這時候的問題常常是不可能縮成一維的了,比如乙個dp[i][j]需要由dp[i - 1 ][k],dp[i - 2][k]決定,i

在DP中使用 滾動陣列

舉個簡單的例子 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 為了節約空間用滾動陣列的方法 in...

POJ 1018(DP 滾動陣列)

這道題本來想用map儲存price所能達到的最大bandwidth,各種tle之後看了discuss,得知雖然price可能很大,但bandwidth卻範圍有限,於是對bandwidth用了滾動陣列dp 考慮 用pre b p表示為標號為i 1的裝置選好製造商後達到的總頻寬為b時的最小 對於標號為i...

poj1159 dp 滾動陣列

如題 給出乙個字串和它的長度,要求輸出最少要加幾個字母這個字串變成回文串。增加回文串的數量 字串長度 字串和它的逆序的最長公共子串行的長度。字串長5000 如果開dp肯定超記憶體,可以使用short定義陣列。不難發現,dp的狀態轉移方程dp i j max dp i 1 j dp i j 1 或dp...