Woodyiiiiiii / LeetCode

My private record of Leetcode solution

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Leetcode 1986. Minimum Number of Work Sessions to Finish the Tasks

Woodyiiiiiii opened this issue · comments

Bitmask + up-bottom dfs

讲解:

class Solution {
    public int minSessions(int[] tasks, int sessionTime) {
        int n = tasks.length;
        Integer[][] dp = new Integer[1 << n][sessionTime];
        return dfs(tasks, n, dp, (1 << n) - 1, 0, sessionTime);
    }

    private int dfs(int[] tasks, int n, Integer[][] dp, int mask, int remainTime, final int sessionTime) {
        if (mask == 0) {
            return 0;
        }
        if (dp[mask][remainTime] != null) {
            return dp[mask][remainTime];
        }
        int ans = n;
        for (int i = 0; i < n; ++i) {
            if ((mask & (1 << i)) == 0) {
                continue;
            }
            int newMask = mask ^ (1 << i);
            if (tasks[i] <= remainTime) {
                ans = Math.min(ans, dfs(tasks, n, dp, newMask, remainTime - tasks[i], sessionTime));
            } else {
                ans = Math.min(ans, 1 + dfs(tasks, n, dp, newMask, sessionTime - tasks[i], sessionTime));
            }
        }
        return dp[mask][remainTime] = ans;
    }

}
class Solution {
    public int minSessions(int[] tasks, int sessionTime) {
        int n = tasks.length;
        Pair[] dp = new Pair[1 << n];
        return dfs(tasks, n, dp, (1 << n) - 1, sessionTime).getKey();
    }

    private Pair dfs(int[] tasks, int n, Pair[] dp, int mask, final int sessionTime) {
        if (mask == 0) {
            return new Pair(0, 0);
        }
        if (dp[mask] != null) {
            return dp[mask];
        }
        int ans = n, remain = 0;
        for (int i = 0; i < n; ++i) {
            if ((mask & (1 << i)) == 0) {
                continue;
            }
            int newMask = mask ^ (1 << i);
            Pair p = dfs(tasks, n, dp, newMask, sessionTime);
            int sessionCnt = p.getKey(), remainTime = p.getValue();
            if (tasks[i] > remainTime) {
                sessionCnt++;
                remainTime = sessionTime - tasks[i];
            } else {
                remainTime -= tasks[i];
            }
            if (sessionCnt < ans || (sessionCnt == ans && remainTime > remain)) {
                ans = sessionCnt;
                remain = remainTime;
            }
        }
        return dp[mask]= new Pair(ans, remain);
    }

    static class Pair {
        int x, y;
        Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
        int getKey() {
            return x;
        }
        int getValue() {
            return y;
        }
    }

}