1. 解题思路
这一题的整体思路就是一个动态规划的思路,我们只需要在当前可以访问的位置当中遍历一下所有的可能性,然后取出其中的最大值即可。
因此,这里的核心问题也就变成了如何快速判断当前可以访问的位置。而这个是一个拓扑图的问题,要想要访问一个节点,其必须要求其依赖的节点都必须被访问过。因此,我们需要先根据给定的依赖关系确定一下每一个节点的依赖节点,然后我们只需要记录下当前所有已经访问过的节点,然后依次判断各个节点的依赖条件是否都被满足即可判断当前节点是否可以被取用。
另外,如果整张图没有任何节点,则我们可以简化问题,直接将其score排序之后依次访问即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def maxProfit(self, n: int, edges: List[List[int]], score: List[int]) -> int:
if len(edges) == 0:
return sum((i+1) * x for i, x in enumerate(sorted(score)))
need = defaultdict(int)
for u, v in edges:
need[v] = need[v] | (1 << u)
@lru_cache(None)
def dp(idx, visited):
if idx > n:
return 0
ans = 0
state = 1
for i in range(n):
if (visited & state == 0) and (need[i] & visited == need[i]):
ans = max(ans, idx * score[i] + dp(idx+1, visited | state))
state = state << 1
return ans
return dp(1, 0)
提交代码评测得到:耗时214ms,占用内存24.3MB。