滾動陣列的簡單實用

2021-06-23 01:57:00 字數 1827 閱讀 5885

二維動規是如果只用到本層的和上一層的資料就可以用滾動陣列

比如 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;

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

乙個簡單的例子:

斐波那契數列:

一般**:

[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...