Я решаю код, и моя функция рекурсии получила что-то вроде этого->
int rec(n)
{
if(n>=(n/2+n/3+n/4))
{
return n;
}
else
{
return rec(n/2) + rec(n/3) + rec(n/4);
}
}
Мне было интересно, какова будет временная сложность этой функции?
Я думаю, что рекуррентное отношение было бы-
T(n) = T(n/2) + T(n/3) + T(n/4) + f(n)
Как решить это рекуррентное соотношение? Каким было бы значение f (n) в этом случае?
Также как преобразовать это в динамическое программирование?
Код, который я написал для преобразования этого в динамический, -
long long rec(long long n)
{
long long c[n]; // The number range is between 1 to 10^9
for(int i=0;i<n;i++)
c[n]=0;
if(n>=(n/2+n/3+n/4))
{
c[n]=n;
return n;
}
else
{
if (c[n]==0)
c[n]=c[n/2]+c[n/3]+c[n/4];
return c[n];
}
}
Однако после преобразования рекурсии в динамическую моя программа отказывается отображать правильный ответ. Думаю, я не преобразовал его как следует в динамическое программирование. Не могли бы вы посоветовать мне, как это сделать.
Спасибо
O(n ^ (a / b))
, я. е. полиномиальный. - person   schedule 30.04.2013