1494. cpp의 Leetcode 솔루션
2691 단어 cpp
class Solution {
public:
int minNumberOfSemesters(int n, vector<vector<int>>& dependencies, int k) {
/*
prerequisite of n courses
if course i is dependent on course j,
then pre[i]'s jth bit will be set
*/
vector<int> pre(n);
for(vector<int>& dep : dependencies){
pre[dep[1]-1] |= (1 << (dep[0]-1));
}
/*
key: the combination of courses(bit representation)
value: minimum days to take all the courses
*/
vector<int> dp(1<<n, n);
//require 0 days to take 0 courses
dp[0] = 0;
/*
need to go into the loop even if cur is 0,
because in there we will update dp[cur|subnext]!
*/
for(int cur = 0; cur < (1<<n); ++cur){
/*
if we have taken all courses specified by "cur",
we can take the courses specified by "next"
*/
int next = 0;
for(int j = 0; j < n; ++j){
/*
if we have taken all prerequisites of course "j",
we can then take course "j" now
*/
if((cur & pre[j]) == pre[j]){
/*
cur is the superset of pre[j],
that means in current state,
we have taken all prerequisites of course j
*/
next |= (1<<j);
}
}
/*
now "next" specify the course we are able to taken,
but we don't need to take the courses that are already taken
(which are specified by cur)
so ""&= ~cur" to exclude those courses
*/
next &= ~cur;
/*
https://cp-algorithms.com/algebra/all-submasks.html
enumerate all the bit 1 combinations(submask)?
*/
for(int subnext = next; subnext; subnext = (subnext-1) & next){
if(__builtin_popcount(subnext) <= k){
//we can take at most k courses in a day
dp[cur|subnext] = min(dp[cur|subnext], dp[cur]+1);
}
}
}
return dp.back();
}
};
리트코드
도전
문제에 대한 링크는 다음과 같습니다.
https://leetcode.com/problems/parallel-courses-ii
Reference
이 문제에 관하여(1494. cpp의 Leetcode 솔루션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/chiki1601/1494-leetcode-solution-in-cpp-2m97
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
문제에 대한 링크는 다음과 같습니다.
https://leetcode.com/problems/parallel-courses-ii
Reference
이 문제에 관하여(1494. cpp의 Leetcode 솔루션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/chiki1601/1494-leetcode-solution-in-cpp-2m97텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)