No.0017-CareerCup

You are given a range [first, last], initially white. You need to paint it black. For this purpose you have a set of triples [(f, l, cost), ...] - where each triple means that you can paint range [f, l] for 'cost' coins (limitations: cost is floating point >= 0, f, l, first, last are integers).
Find the minimum cost needed to paint the whole range [first, last] or return -1 if it's impossible.
Example:
[first, last] = [0, 5] and set of triples are [[0, 5, 10], [0, 4, 1], [0, 2, 5], [2, 5, 1]]. Clearly the answer is to take [0, 4, 1] and [2, 5, 1] - the total cost will be 2.
Another example:
[first, last] = [0, 5] and triples are [[1, 4, 10], [2, 5, 6]]. Answer is -1.
太長(zhǎng)不翻譯。

1. 詢問

fl一定是first, last的子區(qū)間嗎踊赠?假設(shè)是。也就是說不會(huì)超出那個(gè)范圍。

2. 分析

問題探析

這道題并沒有直觀的暴力破解手段陌粹,因?yàn)橐蟮氖怯米畹蚦ost溺蕉。
一看這道題奏属,和區(qū)間還是相關(guān)跨跨,可以考慮先對(duì)區(qū)間進(jìn)行排序。首先肯定是對(duì)f進(jìn)行升序排列囱皿,至于之后需不需要對(duì)l進(jìn)行排序勇婴,還不能確定。
那么嘱腥,至少就可以看到一種解法:每次把當(dāng)前可能選取的區(qū)間都拿出來耕渴,然后進(jìn)行遞歸〉鳎可以認(rèn)為初始區(qū)間是[first, first]萨螺,每次遞歸那些f小于等于當(dāng)前區(qū)間的l的區(qū)間窄做。因?yàn)榧僭O(shè)已經(jīng)認(rèn)為不會(huì)超過范圍愧驱,因此最后結(jié)束的時(shí)候必定是以last做結(jié)尾的,這時(shí)候就可以記錄下cost椭盏。最終選擇最小的cost即可组砚。
排序是O(nlogn)。遞歸的具體時(shí)間復(fù)雜度好像很難看出來的樣子掏颊,另外空間復(fù)雜度肯定也大于O(n)糟红。

DP解法

上面那種解法屬于比較自然的解法,其實(shí)這個(gè)題也可以用DP來解乌叶。Dp[i]用來表示從first到i這個(gè)區(qū)間的最小cost盆偿。顯然題目要求的解就是Dp[last]。
可以預(yù)期的是很多Dp項(xiàng)不會(huì)有值准浴。因此其遞推公式是范圍相關(guān)的事扭。具體來說,就是在i之前的范圍里面去找l大于等于i+1的乐横,然后和Dp[i]的cost相加求橄,假如比當(dāng)前Dp[l]的cost要小今野,就替換之。為了方便挑罐农,需要對(duì)l排序条霜。這樣做的時(shí)間復(fù)雜度是O(tn),t是區(qū)間長(zhǎng)度涵亏,n是給的triples的個(gè)數(shù)宰睡。空間復(fù)雜度是O(n)气筋。初始值就是Dp[first] = 0.

兩種解法都列出來夹厌。

3. 代碼

class Solution(object):
    def sortL(self, L):
        L.sort(key=lambda x: x[1])
        return L

    def sol(self, ranges, L, R):
        seq = self.sortL(ranges)
        dp = [0] + [-1] * (R)
        for j in range(L + 1, R + 1):
            minv = 0x7fffffff
            i = len(seq) - 1
            seq[i][0] = max(L, seq[i][0])
            seq[i][1] = min(R, seq[i][1])
            while i >= 0 and seq[i][1] >= j:
                if seq[i][0] < j and dp[seq[i][0]] != -1 and dp[seq[i][0]] + seq[i][2] < minv:
                    minv = dp[seq[i][0]] + seq[i][2]
                i -= 1
            if minv == 0x7fffffff:
                dp[j] = -1
            else:
                dp[j] = minv
        return dp[R]

    #   solution 2
    def sortF(self, F):
        F.sort(key=lambda x: x[0])
        return F

    def sol2(self, ranges, L, R):
        seq = self.sortF(ranges)
        self.cost = 0x7fffffff
        self.recur(seq, L, R, 0)
        if self.cost == 0x7fffffff:
            return -1
        else:
            return self.cost

    def recur(self, seq, cur, R, cost):
        if cur == R:
            self.cost = min(self.cost, cost)
            return
        Q = []
        for r in seq:
            if r[0] <= cur:
                Q.append(r)
            else:
                break
        T = list(seq)
        for r in Q:
            T.remove(r)
            self.recur(T, r[1], R, cost + r[2])
            T.append(r)

4. 總結(jié)

難度medium~hard。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末裆悄,一起剝皮案震驚了整個(gè)濱河市矛纹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌光稼,老刑警劉巖或南,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異艾君,居然都是意外死亡采够,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門冰垄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹬癌,“玉大人,你說我怎么就攤上這事虹茶∈判剑” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蝴罪,是天一觀的道長(zhǎng)董济。 經(jīng)常有香客問我,道長(zhǎng)要门,這世上最難降的妖魔是什么虏肾? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮欢搜,結(jié)果婚禮上封豪,老公的妹妹穿的比我還像新娘。我一直安慰自己炒瘟,他們只是感情好吹埠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般藻雌。 火紅的嫁衣襯著肌膚如雪雌续。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天胯杭,我揣著相機(jī)與錄音驯杜,去河邊找鬼。 笑死做个,一個(gè)胖子當(dāng)著我的面吹牛鸽心,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播居暖,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼顽频,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了太闺?” 一聲冷哼從身側(cè)響起糯景,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎省骂,沒想到半個(gè)月后蟀淮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钞澳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年怠惶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧粟。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡策治,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兰吟,到底是詐尸還是另有隱情通惫,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布揽祥,位于F島的核電站讽膏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拄丰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一俐末、第九天 我趴在偏房一處隱蔽的房頂上張望料按。 院中可真熱鬧,春花似錦卓箫、人聲如沸载矿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闷盔。三九已至弯洗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逢勾,已是汗流浹背牡整。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溺拱,地道東北人逃贝。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像迫摔,于是被迫代替她去往敵國(guó)和親沐扳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)句占。 張土汪:刷leetcod...
    土汪閱讀 12,745評(píng)論 0 33
  • 動(dòng)態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動(dòng)態(tài)規(guī)劃定義 狀態(tài)轉(zhuǎn)移方程 動(dòng)態(tài)規(guī)劃算法步驟 最長(zhǎng)...
    廖少少閱讀 3,283評(píng)論 0 18
  • 一沪摄、頂部導(dǎo)航 整個(gè)應(yīng)用的導(dǎo)航在頂部,用戶通過左右滑動(dòng)來切換不同的導(dǎo)航選項(xiàng)卡纱烘。主內(nèi)容區(qū)域?qū)⑹且粋€(gè)動(dòng)態(tài)面板卓起。當(dāng)用戶點(diǎn)擊...
    隔壁小貝閱讀 1,660評(píng)論 0 2
  • 退了學(xué)校組織,班委換屆凹炸,周圍的師姐突然安靜了戏阅。從前足夠忙碌的大學(xué)生活是否會(huì)結(jié)束? 剛看到一句話啤它,忙是治療神經(jīng)...
    語訴閱讀 225評(píng)論 0 0
  • 考駕照奕筐,離職,結(jié)婚变骡,研究淘寶离赫。
    鮑鮑愛吃魚閱讀 196評(píng)論 0 0