1+ <!-- 以下は、**PHP 8.2.8** での「カエルの最小ジャンプコスト」問題の実装です。
2+ **処理時間・メモリの消費量を最小限に抑える**ため、\*\*動的計画法(DP)+ 空間最適化(O(1)メモリ)\*\*を採用しています。
3+
4+ ---
5+
6+ ## ✅ PHP 実装(型明示、O(1)メモリ最適化)
7+ <?php
8+
9+ function main (): void {
10+ $ input = trim (stream_get_contents (STDIN ));
11+ $ lines = explode ("\n" , $ input );
12+
13+ /** @var int $N */
14+ $ N = (int )$ lines [0 ];
15+
16+ /** @var array<int> $h */
17+ $ h = array_map ('intval ' , explode (' ' , trim ($ lines [1 ])));
18+
19+ if ($ N === 2 ) {
20+ echo abs ($ h [1 ] - $ h [0 ]) . PHP_EOL ;
21+ return ;
22+ }
23+
24+ /** @var int $prev2 最小コスト(i-2) */
25+ $ prev2 = 0 ;
26+
27+ /** @var int $prev1 最小コスト(i-1) */
28+ $ prev1 = abs ($ h [1 ] - $ h [0 ]);
29+
30+ for ($ i = 2 ; $ i < $ N ; ++$ i ) {
31+ /** @var int $cost1 足場 i-1 から来た場合のコスト */
32+ $ cost1 = $ prev1 + abs ($ h [$ i ] - $ h [$ i - 1 ]);
33+
34+ /** @var int $cost2 足場 i-2 から来た場合のコスト */
35+ $ cost2 = $ prev2 + abs ($ h [$ i ] - $ h [$ i - 2 ]);
36+
37+ /** @var int $curr 現在の足場 i への最小コスト */
38+ $ curr = min ($ cost1 , $ cost2 );
39+
40+ $ prev2 = $ prev1 ;
41+ $ prev1 = $ curr ;
42+ }
43+
44+ echo $ prev1 . PHP_EOL ;
45+ }
46+
47+ main ();
48+
49+ // ## ✅ 入出力形式
50+
51+ // 標準入力から以下の形式で与えられます:
52+
53+ // ```
54+ // N
55+ // h1 h2 h3 ... hN
56+ // ```
57+
58+ // ### 例:
59+
60+ // ```
61+ // 6
62+ // 30 10 60 10 60 50
63+ // ```
64+
65+ // 出力:
66+
67+ // ```
68+ // 40
69+ // ```
70+
71+ // ---
72+
73+ // ## ✅ 計算量とメモリ効率
74+
75+ // | 指標 | 値 |
76+ // | ----- | -------------- |
77+ // | 時間計算量 | O(N) |
78+ // | 空間計算量 | O(1)(定数個の変数のみ) |
79+ // | 入力制約 | 2 ≤ N ≤ 10⁵ |
80+
81+ // ## ✅ 解法のポイント
82+
83+ // * `dp[i]` の代わりに、**直前2ステップ(`prev1`, `prev2`)だけ保持**。
84+ // * `abs()` でジャンプコストを計算。
85+ // * \*\*配列未使用(O(N))\*\*のバージョンも実装可能。
86+
87+ // ## ✅ O(N) メモリバージョン(DP配列使用)
88+
89+ // 参考用に、メモリを多く使うフルDP版も示します:
90+
91+ // ```php
92+ // $dp = array_fill(0, $N, 0);
93+ // $dp[1] = abs($h[1] - $h[0]);
94+ // for ($i = 2; $i < $N; $i++) {
95+ // $dp[$i] = min(
96+ // $dp[$i - 1] + abs($h[$i] - $h[$i - 1]),
97+ // $dp[$i - 2] + abs($h[$i] - $h[$i - 2])
98+ // );
99+ // }
100+ // echo $dp[$N - 1] . PHP_EOL;
0 commit comments