區(qū)間動態(tài)規(guī)劃(記憶化搜索 @ Python) - 石頭合并 粗淺理解

'''
記憶化搜索根资,分治
P1880 [NOI1995]石子合并 @ LuoGu
https://www.luogu.org/problemnew/show/P1880
題目描述
在一個**圓形操場**的四周擺放N堆石子,現(xiàn)要將石子有次序地合并成一堆.規(guī)定每次只能選**相鄰**的2堆合并成新的一堆偷溺,并將新的一堆的石子數(shù),記為該次合并的得分。

試設(shè)計出1個算法,計算出將N堆石子合并成1堆的最小得分和最大得分.

輸入輸出格式
輸入格式:
數(shù)據(jù)的第1行試正整數(shù)N,1≤N≤100,表示有N堆石子.第2行有N個數(shù),分別表示每堆石子的個數(shù).

輸出格式:
輸出共2行,第1行為最小得分,第2行為最大得分.

輸入輸出樣例
輸入樣例#1: 
4

輸出樣例#1: 
43
54
'''

可能對新人(OIer && ACMer請繞道)有用的新概念

前綴和
對應(yīng)一個 List[int] 維護(hù)一個 角標(biāo) i 存著這個 List[int] 0 ~ i 的數(shù)的和,方便通過O(1)減法得到區(qū)間和。
環(huán)
因為是圓形操場晒他,輸入為 [4,5,9,4] 的話悉罕,存在把 [4,4] 合并的情況,學(xué)過離散數(shù)學(xué)的同學(xué)應(yīng)該看過圓桌問題(一個桌子5個人掌逛,能坐多少種不同的順序)师逸,這就需要引入一個大一點的序列以便處理環(huán)現(xiàn)象。

4 5 9 4 -> 5 9 4 4 -> 9 4 4 5 -> 4 4 5 9 -> (4, 5, 9, 4)
那么簡化一下豆混,可以得到
石頭:    [(0), 4, 9, 5, 4, 4, 9, 5, (4)]篓像,和
前綴和:[0, 4, 13, 18, 22, 26, 35, 40, 44]

你可以想象一個長為4的窗口,每移動一位皿伺,就能復(fù)現(xiàn)上面環(huán)的各種情況员辩。括號里面的0 和 4 加進(jìn)來用于處理邊界情況,更方便利用前綴和來獲得區(qū)間和

記憶化搜索有的地方也叫分治法鸵鸥,在國外這手段也被歸并到動態(tài)規(guī)劃奠滑。不過因為涉及遞歸,所以比一般的順序DP會慢一點妒穴。
上代碼宋税,這里只做min的情況,max的話基本上就是這個的映射版:

class Solution(object):
    def getSum(self,i,j):
        return self.s[j] - self.s[i-1]
    def mergeStone(self,nums):
        '''
        nums : List[int]
        '''
        n = len(nums)
        s = []
        nums = [0] + nums + nums
        L = 1
        R = 2*n
        s = [i for i in nums]
        for i in range(1,len(s)):
            # 前綴和
            s[i] = s[i-1] + s[i]
        self.s = s
        # extra 1 for lower limit. 
        self.min_memo = [[None for b in range(n+n+1)] for a in range(n+n+1)]
        
        self.dp_min(L,R)
        minres = float('inf')
        for i in range(1,n+1):
           minres = min(minres,self.min_memo[i][i+n-1])
        print(minres)
    def dp_min(self,i,j):
        '''
        i : 區(qū)間始
        j : 區(qū)間末
        s : 前綴和讼油,用于訪問
        '''

        if j==i:
            self.min_memo[i][j] = 0
            return 0
        elif self.min_memo[i][j] != None:
            return self.min_memo[i][j]
        else:
            this_cost = self.getSum(i,j)
            tres = float('inf')
            for c in range(i,j):
                tres = min(tres,self.dp_min(i,c)+self.dp_min(c+1,j)+this_cost)
            self.min_memo[i][j] = tres
            return tres

區(qū)間DP的思想

其實很簡單
通過遞歸來把大區(qū)間[i,j]杰赛, 以 i <= c <j 為分界線,劃分 子區(qū)間 [i,c], [c+1,j]
self.dp_min(i,c)汁讼,self.dp_min(c+1,j) 為兩個子區(qū)間的最小代價淆攻。
當(dāng)兩個子區(qū)間帶著各自的代價形成,最后形成 [i,j]嘿架,無論兩個子區(qū)間是怎樣的瓶珊,根據(jù)定義,這一步合成的代價一定就是[i,j] 的石子總和耸彪,可以通過前綴和輕松求出伞芹。

BASE CONDITION
self.min_memo[i][i] = 0, 只能代表當(dāng)前單獨第 i 堆,無任何合并操作蝉娜,所以不會產(chǎn)生任何代價唱较。
self.min_memo[i][i+1] 則是兩堆石子合并,其實最終也就通過前綴和來求召川。

大佬巨佬們多多指教小弟做人南缓,我寫這個主要想把所思所想記錄下來,有不少新概念和操作都是看過大神們提一提才慢慢懂荧呐。這篇算是小白文吧汉形,畢竟我想通過簡書或者CSDN搜纸镊,大佬們都寫得像是準(zhǔn)備給水平已經(jīng)很不錯的讀者。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末概疆,一起剝皮案震驚了整個濱河市逗威,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岔冀,老刑警劉巖凯旭,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異使套,居然都是意外死亡罐呼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門童漩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弄贿,“玉大人,你說我怎么就攤上這事矫膨〔畎迹” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵侧馅,是天一觀的道長危尿。 經(jīng)常有香客問我,道長馁痴,這世上最難降的妖魔是什么谊娇? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮罗晕,結(jié)果婚禮上济欢,老公的妹妹穿的比我還像新娘。我一直安慰自己小渊,他們只是感情好法褥,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酬屉,像睡著了一般半等。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呐萨,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天杀饵,我揣著相機與錄音,去河邊找鬼谬擦。 笑死切距,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惨远。 我是一名探鬼主播谜悟,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饵沧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赌躺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羡儿,失蹤者是張志新(化名)和其女友劉穎礼患,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掠归,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡缅叠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了虏冻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肤粱。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖厨相,靈堂內(nèi)的尸體忽然破棺而出领曼,到底是詐尸還是另有隱情,我是刑警寧澤蛮穿,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布庶骄,位于F島的核電站,受9級特大地震影響践磅,放射性物質(zhì)發(fā)生泄漏单刁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一府适、第九天 我趴在偏房一處隱蔽的房頂上張望羔飞。 院中可真熱鬧,春花似錦檐春、人聲如沸逻淌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恍风。三九已至,卻和暖如春誓篱,著一層夾襖步出監(jiān)牢的瞬間朋贬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工窜骄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锦募,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓邻遏,卻偏偏與公主長得像糠亩,于是被迫代替她去往敵國和親虐骑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容