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阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,719评论 0 33
  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,252评论 0 18
  • 一、顶部导航 整个应用的导航在顶部,用户通过左右滑动来切换不同的导航选项卡。主内容区域将是一个动态面板。当用户点击...
    隔壁小贝阅读 1,640评论 0 2
  • 退了学校组织,班委换届,周围的师姐突然安静了。从前足够忙碌的大学生活是否会结束? 刚看到一句话,忙是治疗神经...
    语诉阅读 218评论 0 0
  • 考驾照,离职,结婚,研究淘宝。
    鲍鲍爱吃鱼阅读 190评论 0 0