Я пытаюсь решить простую проблему DP:
Учитывая положительное целое число n, вы можете выполнить любой из следующих 3 шагов. 1) Вычтите из него 1.
2) Если оно делится на 2, разделите на 2.
3) Если оно делится на 3, разделите на 3.
Найдите минимальное количество шагов, которое принимает n к 1 и распечатывает шаги. Если есть несколько решений для достижения цели за одинаковое количество шагов, распечатайте все эти решения. (если сложно, хотя бы распечатайте одно из этих решений).
Набрать минимальное количество шагов не так уж и сложно. Просто примените решение DP снизу вверх следующим образом:
public int getMinSteps(int n) {
int[] dp = new int[n+1];
int i;
dp[1] = 0;
for( i = 2 ; i < = n ; i ++ ) {
dp[i] = 1 + dp[i-1];
if(i%2==0) dp[i] = min( dp[i] , 1+ dp[i/2] );
if(i%3==0) dp[i] = min( dp[i] , 1+ dp[i/3] );
}
return dp[n];
}
Однако мне не удалось решить часть пути печати. На высоком уровне, я думаю, мне нужно остановить «действие», на каждом уровне определяется минимум?
Надеюсь, я могу получить хорошее предложение или решение здесь.
Спасибо!