「全部Infinityなのに、なぜスキップが意味あるの?」
この疑問は完全に正当です!実際には動的にInfinityが有効な値に変わるプロセスを理解する必要があります。
dp[0] = 0 が最初から設定されているため、最初のイテレーション(i=0)では必ず処理が実行され、その後の状態でInfinityの一部が有効な値に変わります。
結果: dp[2]=110, dp[5]=200
効果: 無駄な計算を回避
結果: dp[4]=220, dp[7]=310
効果: 処理時間短縮
| イテレーション i | dp[i]の値 | 処理内容 | 計算量 | 効果 |
|---|---|---|---|---|
| 0 | 0 | 2つの状態遷移実行 | O(1) | 有効状態を作成 |
| 1 | ∞ | スキップ | O(1) → O(0) | 無駄計算回避 |
| 2 | 110 | 2つの状態遷移実行 | O(1) | 新たな有効状態作成 |
| 3 | ∞ | スキップ | O(1) → O(0) | 無駄計算回避 |
| 4 | 220 | 2つの状態遷移実行 | O(1) | 更なる状態展開 |
| 5 | 200 | 2つの状態遷移実行 | O(1) | 最適解候補更新 |
| 6 | ∞ | スキップ | O(1) → O(0) | 無駄計算回避 |
| 7 | 310 | 1つの状態遷移実行 | O(1) | 境界近くの処理 |
| 8 | 400 | 境界により処理なし | O(1) | 最終状態 |
問題点:
利点:
この例での実行回数:
制約条件下での効果:
この早期スキップは「到達可能状態のみを処理する」という動的計画法の核心原理を実現しています。
到達不可能な状態:
到達可能な状態:
早期スキップの真の価値: