public static int MinDifficultyOfJobSchedule(int[] jobDifficulties, int days, int jdStartIdx = 0)
if (jobDifficulties.Length < days) return -1;
int remainingDaysDifficultySum = 0;
for (int i = jdStartIdx; i < jobDifficulties.Length - days + 1; i++)
dayDifficulty = Math.Max(dayDifficulty, jobDifficulties[i]);
remainingDaysDifficultySum = MinDifficultyOfJobSchedule(jobDifficulties, days - 1, i + 1);
Console.WriteLine($"days={days}, jdStartIdx={jdStartIdx}, i={i}, dayDifficulty={dayDifficulty}, remainingDaysDifficultySum={remainingDaysDifficultySum}");
if (jobDifficulty == 0) jobDifficulty = dayDifficulty + remainingDaysDifficultySum;
else jobDifficulty = Math.Min(jobDifficulty, dayDifficulty + remainingDaysDifficultySum);
private static int[,] _dp;
public static int MinDifficultyOfJobScheduleWithDP(int[] jobDifficulties, int days)
if (jobDifficulties.Length < days) return -1;
_dp = new int[days, jobDifficulties.Length];
return MinDifficultyOfJobScheduleWithDP_R(jobDifficulties, days);
private static int MinDifficultyOfJobScheduleWithDP_R(int[] jobDifficulties, int days, int jdStartIdx = 0)
int remainingDaysDifficultySum = 0;
for (int i = jdStartIdx; i < jobDifficulties.Length - days + 1; i++)
dayDifficulty = Math.Max(dayDifficulty, jobDifficulties[i]);
if (_dp[(days - 1) - 1, i + 1] > 0)
remainingDaysDifficultySum = _dp[(days - 1) -1, i + 1];
remainingDaysDifficultySum = MinDifficultyOfJobScheduleWithDP_R(jobDifficulties, days - 1, i + 1);
_dp[(days - 1) -1, i + 1] = remainingDaysDifficultySum;
Console.WriteLine($"days={days}, jdStartIdx={jdStartIdx}, i={i}, dayDifficulty={dayDifficulty}, remainingDaysDifficultySum={remainingDaysDifficultySum}{(lookedUp ? "(looked up)" : "")}");
if (jobDifficulty == 0) jobDifficulty = dayDifficulty + remainingDaysDifficultySum;
else jobDifficulty = Math.Min(jobDifficulty, dayDifficulty + remainingDaysDifficultySum);
public static void Main()
int[] jobDifficulties = new int[] {6, 5, 4, 3, 2, 1};
Console.WriteLine($"input: jobDifficulties=[{string.Join(',', jobDifficulties)}], days={days}");
Console.WriteLine($"min difficulty: {MinDifficultyOfJobSchedule(jobDifficulties, days)}");
jobDifficulties = new int[] {9, 9, 9};
Console.WriteLine($"input: jobDifficulties=[{string.Join(',', jobDifficulties)}], days={days}");
Console.WriteLine($"min difficulty: {MinDifficultyOfJobSchedule(jobDifficulties, days)}");
jobDifficulties = new int[] {1, 1, 1};
Console.WriteLine($"input: jobDifficulties=[{string.Join(',', jobDifficulties)}], days={days}");
Console.WriteLine($"min difficulty: {MinDifficultyOfJobSchedule(jobDifficulties, days)}");
jobDifficulties = new int[] {6, 5, 4, 3, 2, 1};
Console.WriteLine($"input: jobDifficulties=[{string.Join(',', jobDifficulties)}], days={days}");
Console.WriteLine($"min difficulty: {MinDifficultyOfJobScheduleWithDP(jobDifficulties, days)}");