私はダイナミックプログラミングを教えています。それはほぼ魔法のようです。しかし、真剣に。とにかく、私が取り組んだ問題は:Given a stairs of N steps and a child who can either take 1, 2, or 3 steps at a time, how many different ways can the child reach the top step?
でした。問題はそれほど難しくありませんでした。私の実装は以下の通りです。動的プログラミング - 漸近的なランタイムは何ですか?
import java.util.HashMap;
public class ChildSteps {
private HashMap<Integer, Integer> waysToStep;
public ChildSteps() {
waysToStep = new HashMap<Integer, Integer>();
}
public int getNthStep(int n) {
if (n < 0) return 0; // 0 ways to get to a negative step
// Base Case
if (n == 0) return 1;
// If not yet memorized
if (!waysToStep.containsKey(n)) {
waysToStep.put(n, getNthStep(n - 3) + getNthStep(n - 2) + getNthStep(n - 1));
}
return waysToStep.get(n);
}
}
ただし、今はランタイムを取得したいと思います。私はこれをどのように把握すべきですか?私はAkra-BazziとMaster Theoremに慣れています(それほど多くはありません)。それらはここに適用されますか?ここで
http://en.wikipedia.org/wiki/Master_theorem
それができるように思わ:T(N) = 3 * T(???) + O(1)
が、私は本当にわかりません。
ありがとうございます。最悪の場合のシナリオ分析で
最初に数式を計算しましたか? –
いいえ、私は本当に方法が分かりません。何のための方程式、まさに? – lollercoaster
N個のステップを指定すると、一度にmステップをとることができます。あなたが方程式を知ったら、あなたはこれを小さな問題にしました。 –