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.
太長不翻譯。

1. 詢問

fl一定是first, last的子區間嗎?假設是。也就是說不會超出那個范圍。

2. 分析

問題探析

這道題并沒有直觀的暴力破解手段,因為要求的是用最低cost。
一看這道題,和區間還是相關,可以考慮先對區間進行排序。首先肯定是對f進行升序排列,至于之后需不需要對l進行排序,還不能確定。
那么,至少就可以看到一種解法:每次把當前可能選取的區間都拿出來,然后進行遞歸。可以認為初始區間是[first, first],每次遞歸那些f小于等于當前區間的l的區間。因為假設已經認為不會超過范圍,因此最后結束的時候必定是以last做結尾的,這時候就可以記錄下cost。最終選擇最小的cost即可。
排序是O(nlogn)。遞歸的具體時間復雜度好像很難看出來的樣子,另外空間復雜度肯定也大于O(n)。

DP解法

上面那種解法屬于比較自然的解法,其實這個題也可以用DP來解。Dp[i]用來表示從first到i這個區間的最小cost。顯然題目要求的解就是Dp[last]。
可以預期的是很多Dp項不會有值。因此其遞推公式是范圍相關的。具體來說,就是在i之前的范圍里面去找l大于等于i+1的,然后和Dp[i]的cost相加,假如比當前Dp[l]的cost要小,就替換之。為了方便挑,需要對l排序。這樣做的時間復雜度是O(tn),t是區間長度,n是給的triples的個數。空間復雜度是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. 總結

難度medium~hard。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,764評論 0 33
  • 動態規劃(Dynamic Programming) 本文包括: 動態規劃定義 狀態轉移方程 動態規劃算法步驟 最長...
    廖少少閱讀 3,322評論 0 18
  • 一、頂部導航 整個應用的導航在頂部,用戶通過左右滑動來切換不同的導航選項卡。主內容區域將是一個動態面板。當用戶點擊...
    隔壁小貝閱讀 1,679評論 0 2
  • 退了學校組織,班委換屆,周圍的師姐突然安靜了。從前足夠忙碌的大學生活是否會結束? 剛看到一句話,忙是治療神經...
    語訴閱讀 227評論 0 0
  • 考駕照,離職,結婚,研究淘寶。
    鮑鮑愛吃魚閱讀 199評論 0 0