标签:stat int List 并行 dep dependencies 1494 leetcode def
题目描述:
方法:动态规划+状态压缩
class Solution: def minNumberOfSemesters(self, n: int, dependencies: List[List[int]], k: int) -> int: dep = {} # 记录依赖于某节点的节点列表 for a, b in dependencies: if a not in dep: dep[a] = [] dep[a].append(b) @lru_cache(typed=False, maxsize=128000000) def dp(stat): if stat == 0: return 0 all_nodes = [] for i in range(1, n+1): if stat & (1 << i): #通过stat获取,当前考虑的所有课程(在不考虑依赖关系的情况下) all_nodes.append(i) nodes = [] dep_cnt = {node: 0 for node in all_nodes} for node in all_nodes: if node in dep: for next in dep[node]: if next in dep_cnt: dep_cnt[next] += 1 for node, cnt in dep_cnt.items(): #筛选当前学期可供选择的所有课程 if cnt == 0: nodes.append(node) if len(nodes) <= k: #若课程数量小于k,则当前学期上所有的课程 new_stat = stat for node in nodes: new_stat &= ~(1 << node) #可用异或代替 ans = 1 + dp(new_stat) return ans else: ans = 0x7fffffff for combi in combinations(nodes, k): #枚举所有数量为k的子集 new_stat = stat for node in combi: new_stat &= ~(1 << node) ans = min(ans, 1 + dp(new_stat)) return ans return dp((1 << (n+1)) - 2) #剪2是因为去掉最低向和最高项,因为此代码的循环是从1到n,最小左移为1,最大左移为n 作者:Anniubility 链接:https://leetcode-cn.com/problems/parallel-courses-ii/solution/dong-tai-gui-hua-ya-suo-dpjie-yong-mei-ju-zi-ji-ch/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
标签:stat,int,List,并行,dep,dependencies,1494,leetcode,def 来源: https://www.cnblogs.com/oldby/p/13217347.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。