滚动数组~\(≧▽≦)/~
今天第一次用了滾動(dòng)數(shù)組,緣由要從一道題說(shuō)起:POJ 1159 Palindrome
? ?題意:給你一個(gè)字符串,求對(duì)字符串最少添加幾個(gè)字符可變?yōu)榛匚拇?/p>
? ?分析: 簡(jiǎn)單做法是直接對(duì)它和它的逆序串求最長(zhǎng)公共子序列長(zhǎng)度len。n-len即為所求。至于為什么,小盆友們可以自己模擬一下下。O(∩_∩)O~因?yàn)檫@不是我們今天講的重點(diǎn)~噶嗚
很明顯這是一道LCS題,如果你還不知道什么是LCS,可以點(diǎn)擊 ?LCS??,我們都知道要開(kāi)辟一個(gè)dp[5001][5001]的數(shù)組來(lái)存LCS值,問(wèn)題來(lái)了,當(dāng)我開(kāi)心的交上代碼的時(shí)候竟然
內(nèi)存超限了~!!看了下討論組,說(shuō)改成short int 能過(guò),果然過(guò)了,但是memory==49156.。。太大了。上網(wǎng)一搜,發(fā)現(xiàn)了滾動(dòng)數(shù)組這個(gè)東西,memory立即編程188K。啥都不說(shuō)了,進(jìn)入正題!
? ? 滾動(dòng)數(shù)組的作用在于優(yōu)化空間,主要應(yīng)用在遞推或動(dòng)態(tài)規(guī)劃中(如01背包問(wèn)題)。因?yàn)镈P題目是一個(gè)自底向上的擴(kuò)展過(guò)程,我們常常需要用到的是連續(xù)的解,前面的解往往可以
舍去。所以用滾動(dòng)數(shù)組優(yōu)化是很有效的。利用滾動(dòng)數(shù)組的話在N很大的情況下可以達(dá)到壓縮存儲(chǔ)的作用。
? ??一個(gè)DP,如果需要1000×1000的空間,其實(shí)根據(jù)DP的無(wú)后效性,可以開(kāi)成2×1000,然后通過(guò)滾動(dòng),獲得和1000×1000一樣的效果。
? ? 滾動(dòng)數(shù)組常用于DP之中,在DP過(guò)程中,我們?cè)谟梢粋€(gè)狀態(tài)轉(zhuǎn)向另一個(gè)狀態(tài)時(shí),很可能之前存儲(chǔ)的某些狀態(tài)信息就已經(jīng)無(wú)用了,例如在01背包問(wèn)題中,從理解角度講我們應(yīng)開(kāi)
DP[i][j]的二維數(shù)組,第一維我們存處理到第幾個(gè)物品,也就是階段了,第二維存儲(chǔ)容量,但是我們獲得DP[i],只需使用DP[i - 1]的信息,DP[i - k],k>1都成了無(wú)用空間,因此我們
可以將數(shù)組開(kāi)成一維就行,迭代更新數(shù)組中內(nèi)容,滾動(dòng)數(shù)組也是這個(gè)原理,目的也一樣,不過(guò)這時(shí)候的問(wèn)題常常是不可能縮成一維的了,比如一個(gè)DP[i][j]需要由DP[i - 1 ][k],
DP[i - 2][k]決定,i<n,0<k<=10;n <=100000000;顯然縮不成一維,正常我們應(yīng)該開(kāi)一個(gè)DP[100000005][11]的數(shù)組,結(jié)果很明顯,超內(nèi)存,其實(shí)我們只要開(kāi)DP[3][11]
就夠了DP[i%3][j]由DP[(i - 1)%3][k]和DP[(i - 2)%3][k]決定,空間復(fù)雜度差別巨大。
? ?學(xué)以致用:http://poj.org/problem?id=1159?小盆友們快去做一做吧~噶嗚~
轉(zhuǎn)載于:https://www.cnblogs.com/PJQOOO/p/3900677.html
總結(jié)
以上是生活随笔為你收集整理的滚动数组~\(≧▽≦)/~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 咏南中间件集群解决方案
- 下一篇: 解决VS2010链接错误:LINK fa