Заявление о проблемах:Минимум шагов к одному
На положительное целое число вы можете выполнить любой из следующих трех шагов.
- Вычесть 1 из него. (n = n - 1)
- Если его делящийся на 2, разделите на 2. (если n% 2 == 0, то n = n/2)
- Если его делится на 3, разделите на 3. (если n% 3 == 0, то n = n/3).
Теперь вопрос, учитывая положительное целое число п, найти минимальное количество шагов, которые принимает п 1
например:
- При п = 1, выход: 0
- При п = 4, выход: 2 (4/2 = 2/2 = 1)
- При п = 7, выход: 3 (7 -1 = 6/3 = 2/2 = 1)
Я знаю решение, использующее динамическое программирование и имеющее целочисленный массив. вот код.
public int bottomup(int n) {
//here i am defining an integer array
//Exception is thrown here, if the n values is high.
public int[] bu = new int[n+1];
bu[0] = 0;
bu[1] = 0;
for(int i=2;i<=n;i++) {
int r = 1+bu[i-1];
if(i%2 == 0) r = Math.min(r,1+bu[i/2]);
if(i%3 == 0) r = Math.min(r,1+bu[i/3]);
bu[i] = r;
}
return bu[n];
}
Но я хочу, чтобы решить эту проблему с помощью менее space.This решение бросает OutOfMemoryError в Java, если п = 100000000.I не хочет, чтобы увеличить мой ворох space.Does кто имеет решение, используя меньше места?
Обратите внимание, что эта проблема не может быть решена с использованием жадного алгоритма. Использование одного цикла while и проверка на делимое на 3 и делимое на 2 не работает. Вам нужно использовать динамическое программирование.please, если у любого есть решение, использующее меньшее пространство.
например:
при п = 10 жадным алгоритмом 10/2 = 5 -1 = 4/2 = 2/2 = 1, который занимает 4 steps.where как решение должно быть 10-1 = 9/3 = 3/3 = 1, 3 шага.
Я даже попробовал решение по опрокидыванию.
public int[] td = null;
public int topdown(int n) {
if(n <= 1) return 0;
int r = 1+topdown(n-1);
if(td[n] == 0) {
if(n%2 == 0) r = Math.min(r,1+topdown(n/2));
if(n%3 == 0) r = Math.min(r,1+topdown(n/3));
td[n] = r;
}
return td[n];
}
Ошибка при n = 10000.
Один из способов сделать это, потому что число шагов O (журнал (п)), вы можете использовать короткий вместо междунар для Int входов. – elyashiv
По той же идее, что и @elyashiv, байт тоже. –
Насколько высока «n», с которой вы хотите справиться? Космические соображения * вероятно *, почему упражнения, подобные [SPOJ] (http://www.spoj.com/problems/MST1/), ограничивают его '(0
Geobits