【发布时间】:2012-11-19 04:34:45
【问题描述】:
我正在尝试解决一个简单的 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];
}
但是,我无法解决打印路径部分。在高层次上,我认为我需要在每个层次上停止“行动”,确定一个最低限度?
希望我能在这里得到一些好的建议或解决方案。
谢谢!
【问题讨论】:
标签: java algorithm dynamic-programming