私は単純なDP問題を解決しようとしています:
正の整数nが与えられると、次の3つのステップのいずれかを実行できます。1)それから1を引きます。
2)2で割り切れる場合は、2で割ります
。3)3で割り切れる場合は、3で割り
ます。nから1になる最小ステップ数を見つけて、ステップを印刷します。同じステップ数で目標を達成するための複数のソリューションがある場合は、これらすべてのソリューションを印刷してください。(難しい場合は、少なくともこれらの解決策の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];
}
しかし、プリントパス部分は解けませんでした。高レベルでは、最小値が決定されるすべてのレベルで「アクション」を停止する必要があると思いますか?
ここでいくつかの良い提案や解決策が得られることを願っています。
ありがとう!