๐ One-stop destination for all your technical interview Preparation ๐
lastTask
is the task performed by ninja for last day. values of lastTask -> [0,3], i means ith task is performed, 3 means no task performed.lastTask
will be 3 as no tasks are performed by ninja.lastTask
.
f(day, task) = max(f(day, task), pts[day][task] + f(day-1,task))
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);
}
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);
}
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];
}
prev
array of size 4 as there are 4 possible lastTasks(0,1,2,3).prev
array.curr
array of size 4.prev
array with curr
array.prev[3]
.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];
}