1+ <!-- 以下は、**PHP 8.2.8** での「カエルの最小コスト移動経路」問題の解法です。
2+
3+ * **型アノテーション対応**(PHP 8.2 準拠)
4+ * **処理時間 O(N)**、**メモリ使用量 O(N)** に抑えた動的計画法(DP)
5+ * **標準入力(STDIN)対応**
6+ * 実行制限:**時間 1秒以内、メモリ 1024MiB以下**
7+
8+ ---
9+
10+ ## ✅ PHP 実装(`Main.php`)
11+
12+ ```php -->
13+ <?php
14+
15+ declare (strict_types=1 );
16+
17+ function main (): void {
18+ $ input = trim (stream_get_contents (STDIN ));
19+ $ lines = explode ("\n" , $ input );
20+
21+ $ N = intval ($ lines [0 ]);
22+ $ h = array_map ('intval ' , preg_split ('/\s+/ ' , $ lines [1 ]));
23+
24+ /** @var int[] $dp 最小コスト配列 */
25+ $ dp = array_fill (0 , $ N , INF );
26+ /** @var int[] $prev 経路復元用配列 */
27+ $ prev = array_fill (0 , $ N , -1 );
28+
29+ $ dp [0 ] = 0 ;
30+
31+ for ($ i = 1 ; $ i < $ N ; $ i ++) {
32+ $ cost1 = $ dp [$ i - 1 ] + abs ($ h [$ i ] - $ h [$ i - 1 ]);
33+ if ($ cost1 < $ dp [$ i ]) {
34+ $ dp [$ i ] = $ cost1 ;
35+ $ prev [$ i ] = $ i - 1 ;
36+ }
37+
38+ if ($ i > 1 ) {
39+ $ cost2 = $ dp [$ i - 2 ] + abs ($ h [$ i ] - $ h [$ i - 2 ]);
40+ if ($ cost2 < $ dp [$ i ]) {
41+ $ dp [$ i ] = $ cost2 ;
42+ $ prev [$ i ] = $ i - 2 ;
43+ }
44+ }
45+ }
46+
47+ /** @var int[] $path 経路復元 */
48+ $ path = [];
49+ $ current = $ N - 1 ;
50+ while ($ current !== -1 ) {
51+ $ path [] = $ current + 1 ; // 1-indexed
52+ $ current = $ prev [$ current ];
53+ }
54+
55+ $ path = array_reverse ($ path );
56+
57+ echo count ($ path ) . "\n" ;
58+ echo implode (' ' , $ path ) . "\n" ;
59+ }
60+
61+ main ();
62+ // ```
63+
64+ // ---
65+
66+ // ## ⏱️ 計算量・メモリ使用量
67+
68+ // | 項目 | 内容 |
69+ // | ------ | --------------------- |
70+ // | 時間計算量 | O(N) |
71+ // | 空間計算量 | O(N) |
72+ // | メモリ使用量 | 約 1MB(N ≦ 100000 の場合) |
73+
74+ // ---
75+
76+ // ## 📥 入力例
77+
78+ // ```
79+ // 6
80+ // 30 10 60 10 60 50
81+ // ```
82+
83+ // ---
84+
85+ // ## 📤 出力例
86+
87+ // ```
88+ // 4
89+ // 1 3 5 6
90+ // ```
91+
92+ // ---
93+
94+ // ## ✅ 実行方法
95+
96+ // ```bash
97+ // php Main.php < input.txt
98+ // ```
99+
100+ // ---
101+
102+ // ## 💡 補足
103+
104+ // * `dp[i]` は i 番目の足場にたどり着くまでの最小コスト
105+ // * `prev[i]` はどの足場から来たか(経路復元用)
106+ // * 経路は逆順にたどってから `array_reverse()` で正順に戻す
107+
108+ // ---
0 commit comments