1+ <!-- 以下に、**PHP 8.2.8** を用いた「最長回文部分列の長さ(Longest Palindromic Subsequence)」を求めるコードを提示します。
2+ **型指定・関数化・処理時間とメモリ効率を考慮**した実装です。
3+
4+ ---
5+
6+ ## ✅ PHPコード(標準入力+DPでの最長回文部分列)
7+
8+ <?php
9+
10+ declare (strict_types=1 );
11+
12+ /**
13+ * 与えられた文字列 S に対し、削除のみで構成可能な最長回文部分列の長さを求める。
14+ *
15+ * @param string $s 入力文字列(英小文字のみ)
16+ * @return int 最長回文部分列の長さ
17+ */
18+ function longestPalindromicSubsequence (string $ s ): int
19+ {
20+ $ n = strlen ($ s );
21+
22+ // dp[i][j] := S[i..j]の最長回文部分列の長さ
23+ $ dp = array_fill (0 , $ n , array_fill (0 , $ n , 0 ));
24+
25+ // 長さ1の部分列は常に回文(自己一致)
26+ for ($ i = 0 ; $ i < $ n ; $ i ++) {
27+ $ dp [$ i ][$ i ] = 1 ;
28+ }
29+
30+ // 部分列の長さ2からnまでのDP
31+ for ($ length = 2 ; $ length <= $ n ; $ length ++) {
32+ for ($ i = 0 ; $ i <= $ n - $ length ; $ i ++) {
33+ $ j = $ i + $ length - 1 ;
34+
35+ if ($ s [$ i ] === $ s [$ j ]) {
36+ $ dp [$ i ][$ j ] = ($ length === 2 ) ? 2 : $ dp [$ i + 1 ][$ j - 1 ] + 2 ;
37+ } else {
38+ $ dp [$ i ][$ j ] = max ($ dp [$ i + 1 ][$ j ], $ dp [$ i ][$ j - 1 ]);
39+ }
40+ }
41+ }
42+
43+ return $ dp [0 ][$ n - 1 ];
44+ }
45+
46+ // 標準入力からの読み取り処理(複数行)
47+ $ input = explode ("\n" , trim (file_get_contents ("php://stdin " )));
48+ $ n = (int )$ input [0 ];
49+ $ s = $ input [1 ];
50+
51+ // 関数呼び出しと出力
52+ $ result = longestPalindromicSubsequence ($ s );
53+ echo $ result . PHP_EOL ;
54+
55+ // ## ✅ 入力例と出力
56+
57+ // ### 入力:
58+
59+ // ```
60+ // 11
61+ // programming
62+ // ```
63+
64+ // ### 出力:
65+
66+ // ```
67+ // 4
68+ // ```
69+
70+ // ---
71+
72+ // ## ✅ 処理量の見積もり
73+
74+ // | 項目 | 値 |
75+ // | ------ | --------------------------- |
76+ // | 時間計算量 | O(N²)(最大 1000 × 1000 = 10⁶) |
77+ // | 空間計算量 | O(N²)(1000×1000 要素)≈ 4〜8MB |
78+ // | メモリ制限 | 1024 MiB → 問題なし |
79+ // | 実行時間制限 | 1秒 → 通常の PHP 実行でも問題なし |
80+
81+ // ---
82+
83+ // ## ✅ 型とコメントに関する補足
84+
85+ // * PHP 8.2 では関数の戻り値型 (`int`) や引数型 (`string`) が厳密にサポートされています。
86+ // * `$dp` は二次元配列 `int[][]` で、PHPの動的配列構造を使用。
87+ // * 配列初期化は `array_fill()` を使って高速・省メモリ化。
88+
89+ // ---
90+
91+ // ## ✅ 追加対応可能な事項
92+
93+ // * 実際の回文を**復元して出力する拡張バージョン**
94+ // * メモリ最適化(1次元DP化)※可能だが読みづらくなる
95+
96+ // ご希望があれば続けてご提供可能です。
0 commit comments