Complete-Preparation

๐ŸŽ‰ One-stop destination for all your technical interview Preparation ๐ŸŽ‰

View the Project on GitHub

Ninjaโ€™s Training ๐ŸŒŸ๐ŸŒŸ

Recursive solution

Code

int helper(vector<vector<int>>& pts, int day, int lastTask)
{
    int mxPoints = 0;
    if (day == 0) {
        for (int task = 0; task < 3; task++) {
            if (task != lastTask) {
                mxPoints = max(mxPoints, pts[day][task]);
            }
        }
        return mxPoints;
    }

    for (int task = 0; task < 3; task++) {
        if (task != lastTask) {
            int currPoints = pts[day][task] + helper(pts, day - 1, task);
            mxPoints = max(mxPoints, currPoints);
        }
    }
    return mxPoints;
}

int ninjaTraining(int n, vector<vector<int>>& points)
{
    return helper(points, n - 1, 3);
}

Memoization(top-down)

Code

int helper(vector<vector<int>>& pts, vector<vector<int>>& memo, int day, int lastTask)
{
    int mxPoints = 0;
    if (day == 0) {
        for (int task = 0; task < 3; task++) {
            if (task != lastTask) {
                mxPoints = max(mxPoints, pts[day][task]);
            }
        }
        return memo[day][lastTask] = mxPoints;
    }

    if (memo[day][lastTask] != -1) return memo[day][lastTask];

    for (int task = 0; task < 3; task++) {
        if (task != lastTask) {
            int points = pts[day][task] + helper(pts, memo, day - 1, task);
            mxPoints = max(mxPoints, points);
        }
    }
    return memo[day][lastTask] = mxPoints;
}

int ninjaTraining(int n, vector<vector<int>>& points)
{
    vector<vector<int>> memo(n, vector<int>(4, -1));
    return helper(points, memo, n - 1, 3);
}

Tabulation(bottom-up)

Code

int ninjaTraining(int n, vector<vector<int>>& points)
{
    vector<vector<int>> dp(n, vector<int>(4, 0));
    dp[0][0] = max(points[0][1], points[0][2]);
    dp[0][1] = max(points[0][0], points[0][2]);
    dp[0][2] = max(points[0][0], points[0][1]);
    dp[0][3] = max({ points[0][0], points[0][1], points[0][2] });

    for (int day = 1; day < n; day++) {
        for (int lastTask = 0; lastTask < 4; lastTask++) {
            dp[day][lastTask] = 0;
            for (int task = 0; task < 3; task++) {
                if (task != lastTask) {
                    int curr = points[day][task] + dp[day - 1][task];
                    dp[day][lastTask] = max(curr, dp[day][lastTask]);
                }
            }
        }
    }
    return dp[n - 1][3];
}

Space Optimized Tabulation

Code

int ninjaTraining(int n, vector<vector<int>>& points)
{
    vector<int> prev(4, 0);
    prev[0] = max(points[0][1], points[0][2]);
    prev[1] = max(points[0][0], points[0][2]);
    prev[2] = max(points[0][0], points[0][1]);
    prev[3] = max({ points[0][0], points[0][1], points[0][2] });

    for (int day = 1; day < n; day++) {
        vector<int> curr(4, 0);
        for (int lastTask = 0; lastTask < 4; lastTask++) {
            curr[lastTask] = 0;
            for (int task = 0; task < 3; task++) {
                if (task != lastTask) {
                    curr[lastTask] = max(curr[lastTask], points[day][task] + prev[task]);
                }
            }
        }
        prev = curr;
    }
    return prev[3];
}