我正在尝试解决一个简单的 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];
}
但是,我无法解决打印路径部分。在高层次上,我认为我需要在每个层次上停止“行动”,确定一个最低限度?
希望我能在这里得到一些好的建议或解决方案。
谢谢!