Мне нужно создать решение динамического программирования для следующей задачи:
Учитывая набор из n ступеней, так что каждый шаг ступени имеет положительное значение, как мы можем максимизировать значение, если нам разрешеноk поднимается по лестнице, и мы можем пропустить 1 или 2 шага за раз
Пример:
Дано обр. 5, 1, 6, 2, 8, 9 n = 6
k = 3 мы бы взяли 6,8,9
k = 2 мы бы взяли 6,9
k = 1 мы не смогли бы добраться до вершиныЛестница, самая дальняя, которую мы могли бы получить, это оценить 6
k = n, мы бы сделали все шаги
Что сбивает меня с толку, так это то, что вы должны принятьпоследнее значение (чтобы добраться до вершины лестницы), и вы должны принимать значения таким образом, чтобы вы могли действительно достичь конца. Спасибо за любую помощь или указатели в правильном направлении, спасибо!
Обновление:
Я смог кешировать рекурсивные вызовы и достигнуть O (n * k), не зная, какдостичь решения DP здесь.
int myMem(int arr[], int n, int L)
{
count += 1;
if (L == 0 && n < 1)
return 0;
if (L == n/3)
{
if(mem[n-1][L] == 0)
mem[n-1][L] = myMem(arr, n-3, L-1);
return arr[n-1] + mem[n-1][L];
}
if (n < 1)
return INT_MIN;
if (L > n/3)
{
if(mem[n-1][L] == 0)
mem[n-1][L] = myMax( myMem(arr, n-1, L-1), myMem(arr, n-2, L-1), myMem(arr, n-3, L-1));
return arr[n-1] + mem[n-1][L];
}
return INT_MIN;
}