二維動規是如果只用到本層的和上一層的資料就可以用滾動陣列滾動陣列的作用在於優化空間,主要應用在遞推或動態規劃中(如01揹包問題)。因為dp題目是乙個自底向上的擴充套件過程,我們常常需要用到的是連續的解,前面的解往往可以捨去。所以用滾動陣列優化是很有效的。利用滾動陣列的話在n很大的情況下可以達到壓縮儲存的作用。比如 dp[i,j]=max(dp[i-1,j],dp[i,j-1]);
max的意思就不多說了...
具體例子的話,比較經典的就是最長公共子串行,就是 abcde 和 aecd的最長公共子串行就是acd。
如果不是滾動陣列的話就是
for i:=1 to length(st1) do
for j:=1 to length(st2)do
if st1[i]=st2[j] then dp[i,j]:=dp[i-1,j-1]+1
else dp[i,j]:=max(dp[i-1,j],dp[i,j-1]);
如果用滾動陣列的話就要討論一下奇偶性
for i:=1 to length(st1) do
for j:=1 to length(st2)do
if odd(i) then
begin
if st1[i]=st1[j] then dp[1,j]:=dp[2,j-1]+1
else dp[1,j]:=max(dp[2,j],dp[1,j-1]);
endelse
begin
if st1[i]=st2[j] then dp[2,j]:=dp[1,j-1]+1
else dp[2,j]:=max(dp[1,j],dp[2,j-1]);
end;
乙個簡單的例子:
斐波那契數列:
一般**:
[cpp] view plaincopy
#include#includeusing namespace std;
int fib[25];
int fib(int n)
int main()
return 0;
} 利用滾動陣列優化後**為:
[cpp] view plaincopy
#includeusing namespace std;
int fib[3];
int fib(int n)
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#include#includeusing namespace std;
char s1[1010],s2[1010];
int len1,len2;
int dp[2][1010];
int main()
}cout<
01揹包滾動陣列的簡單理解
前言 覺得二進位制很nb,想學狀態壓縮,可是不會動態規劃,連揹包都不會的那種,從頭開始吧!0.問題 給定一組物品,每種物品都有自己的重量wi i 1,2,3 n 和 vi i 1,2,3 n 在限定的總重量 w 內,我們如何選擇,才能使得物品的總 最高。1.初始化 我們定義dp i j 表示在揹包容...
HDU 1024 簡單dp 滾動陣列
要求 n個正數組成的序列,整數範圍 32768 s 32767,1 n 1,000,000,挑出m個無交集的連續子串行使這些序列和最大,並輸出最大值。方法 二維dp 滾動陣列降維。1.dp i j 表示第乙個數到下標為j的數挑出i個連續子串行組成的最大值。2.dp i j max dp i j 1 ...
ListView的簡單實用
獲得陣列的 typedarray image getresources obtaintypedarray r.array.image int imageid new int image.length 獲得陣列對應的id for int i 0 i image.length i 獲得陣列的字串 str...