Leetcode 2050 Parallel Courses III

今天刷到了這樣一道題, 同時(shí)涉及了拓?fù)渑判蚝蛣?dòng)態(tài)規(guī)劃算法,記錄一下解題思路
題目如下

You are given an integer n, which indicates that there are n courses labeled from 1 to n. You are also given a 2D integer array relations where relations[j] = [prevCoursej, nextCoursej] denotes that course prevCoursej has to be completed before course nextCoursej (prerequisite relationship). Furthermore, you are given a 0-indexed integer array time where time[i] denotes how many months it takes to complete the (i+1)th course.

You must find the minimum number of months needed to complete all the courses following these rules:

You may start taking a course at any time if the prerequisites are met.
Any number of courses can be taken at the same time.
Return the minimum number of months needed to complete all the courses.

Note: The test cases are generated such that it is possible to complete every course (i.e., the graph is a directed acyclic graph).

首先由于課程有互相依賴, 我們需要決定上課順序, 這部分使用拓?fù)渑判騺斫鉀Q
其主要思路是構(gòu)建入度表, 尋找當(dāng)前入度為0的課程,也就是前置課程已經(jīng)上完的課
在完成每一門課程后, 檢查它的后置課程的入度,如果也是0就加入課程列表

本題允許同時(shí)上無限門課故
狀態(tài)轉(zhuǎn)移方程: 完成dp[i]課程后的時(shí)間 = dp[i]課程話費(fèi)的時(shí)間 + max(dp[i]的前置課程最遲的一門的完成時(shí)間)

代碼如下

import collections


class Solution:
    def minimumTime(self, n: int, relations: List[List[int]], time: List[int]) -> int:
        # 入讀表
        indegree = [0] * n
        # 鄰接表
        adjacency = collections.defaultdict(list)
        # 逆鄰接表
        reversedAdjacency = collections.defaultdict(list)
        # 完成dp[i]課程后的時(shí)間
        # 狀態(tài)轉(zhuǎn)移方程: 完成dp[i]課程后的時(shí)間 = dp[i]課程話費(fèi)的時(shí)間 + max(dp[i]的前置課程最遲的一門的完成時(shí)間)
        dp = [0] * n
        # 初始化入讀表省容、鄰接表骂维、逆鄰接表(坐標(biāo)改為0開始的)
        for outNode, inNode in relations:
            indegree[inNode-1] += 1
            adjacency[outNode-1].append(inNode-1)
            reversedAdjacency[inNode-1].append(outNode-1)
        queue = collections.deque()

        # 尋找沒有前置課程的課程作為第一批學(xué)習(xí)的課程
        for i in range(n):
            if indegree[i] == 0:
                queue.append(i)
                # 對(duì)于入度為0的點(diǎn),即無前置課程的課程,完成的時(shí)間即課程所花費(fèi)的時(shí)間
                dp[i] = time[i]

        while queue:
            # 學(xué)習(xí)隊(duì)列中的課程
            course = queue.popleft()
            # 尋找前置課程中最后完成的一個(gè)
            pre_course_max = 0
            for pre_course in reversedAdjacency[course]:
                    pre_course_max = max(pre_course_max, dp[pre_course])
            # 根據(jù)狀態(tài)轉(zhuǎn)移方程更新這門課程的完成時(shí)間
            dp[course] = pre_course_max + time[course]
            # 找出已完成前置課程的課, 加入待學(xué)習(xí)課程隊(duì)列
            for c in adjacency[course]:
                indegree[c] -= 1
                if indegree[c] == 0:
                    queue.append(c)
        return max(dp)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寂纪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗤练,更是在濱河造成了極大的恐慌俭驮,老刑警劉巖苛让,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件火惊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡累贤,警方通過查閱死者的電腦和手機(jī)叠穆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臼膏,“玉大人硼被,你說我怎么就攤上這事∩酰” “怎么了嚷硫?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長始鱼。 經(jīng)常有香客問我仔掸,道長,這世上最難降的妖魔是什么医清? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任起暮,我火速辦了婚禮,結(jié)果婚禮上会烙,老公的妹妹穿的比我還像新娘负懦。我一直安慰自己,他們只是感情好柏腻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布纸厉。 她就那樣靜靜地躺著,像睡著了一般五嫂。 火紅的嫁衣襯著肌膚如雪颗品。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音抛猫,去河邊找鬼。 笑死孩灯,一個(gè)胖子當(dāng)著我的面吹牛闺金,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播峰档,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼败匹,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了讥巡?” 一聲冷哼從身側(cè)響起掀亩,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎欢顷,沒想到半個(gè)月后槽棍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抬驴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年炼七,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片布持。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豌拙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出题暖,到底是詐尸還是另有隱情按傅,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布胧卤,位于F島的核電站唯绍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏枝誊。R本人自食惡果不足惜推捐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侧啼。 院中可真熱鬧牛柒,春花似錦、人聲如沸痊乾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哪审。三九已至蛾魄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滴须。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工舌狗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扔水。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓痛侍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親魔市。 傳聞我的和親對(duì)象是個(gè)殘疾皇子主届,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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