У меня есть конкретная c проблема. Я пытаюсь решить проблему LeetCode 121 . Согласно LeetCode, это проблема динамического программирования c, но все упоминали, что она не требует DP. Однако, чтобы понять DP, я хочу решить его, используя DP, рекурсию с помощью грубой силы и Memoization. Я написал код рекурсивного перебора следующим образом:
int maxProfit(int prices[], int buyIndex, int curIndex, int N) {
if (N <= 0) {
return 0;
}
int p1 = INT_MIN;
int p2 = INT_MIN;
int p3 = INT_MIN;
if (buyIndex == -1) {
// Can buy now
p1 = maxProfit(prices, curIndex, curIndex+1, N-1);
}else{
// Can sell now
p2 = prices[curIndex] - prices[buyIndex];
}
// Ignore both buy ans sell
p3 = maxProfit(prices, buyIndex, curIndex+1, N-1);
return max(p1, max(p2, p3));
}
int maxProfit(int prices[], int N) {
return maxProfit(prices, -1, 0, N);
}
Он отлично работает для всех тестовых случаев, но, как и ожидалось, он дает TLE для большого ввода. Я понимаю, почему это дает TLE. Теперь, чтобы уменьшить количество рекурсивных вызовов, я собираюсь использовать запоминание, но я не могу определить переменную, управляющую состоянием, или, другими словами, по каким значениям я должен создать таблицу повторений? Если кто-то может нарисовать дерево повторений, это поможет мне понять код и размер таблицы.
Заранее спасибо.