私は、題し:
n個の整数の増分シーケンスの整数の最長のシーケンスを探します。サブシーケンスを増加させることは、元の順序に従った順序で配列された非連続配列の整数であってもよいです。最長の増加は、その配列が最長系列長でインクリメントします。
第二に、問題解決のアイデア:
結果は、最も長いシーケンスを保持している文字列を作成します。
条件が配置されていない場合、条件は、またはなしで充填した場合、元のシーケンスの各数のために、選択することができます。
考えて再帰では、すべての可能な結果はすぐに最大の配列を選出し、その大きさを決定することにより、その後のシーケンスを導出し、することができます。
地図上の分析:
黒線は、条件の数と、ない黄色ラインに行に次を表す(図上脚123が完全与える描かれていない)緑色楕円で結果が得られた最後の可能な配列であることを示します。
34123に、例えば、3が選択された4×4にまたは(数がロードされた前に配置数より大きくなければならない)に入れることができ、回答の配列が3又は3に配置されていない開始することを選択することができますそれが最後の読み取り元のシーケンス番号まで、そのように維持するか、もはや資格の番号を見つけること、そして最終的に比較することによって、最も長いシーケンスは、応答シーケンスを取得します。
第三に、実装コード
1 パブリック クラスLong_list { 2 公共の文字列リスト(文字S []){ 3。 文字列T = "" ; 4 リターン L(S、T、0 ); 5 } 。6 。7 プライベート文字列L(CHAR S []、文字列T、INT LO){ // 決意をケース内にロードされていないすべての修飾を完了するために開始 8。 IF(LO> s.length - 1){ // 完了した最後のものが決定される出口1。 9。 リターンT。 10 } 11。 文字列K = "" ; 12である ため(int型、iは= LOは<s.lengthと、iは++ ){ 13 であれば((t.length()== 0)||((t.length() - 1> = 0)&& t.charAt(T。長さ() - 1)< S [I])){ 14 、K = T + S [i]は、// 连接 15 ブレーク。 16 } 17 } 18 リターン MAX(L(S、T、LO + 1)、L(S、K、LO + 1 ))。 19 } 20 21 プライベート文字列の最大値(列L、文字列L2){ 22 リターン l.length()> = l2.length()?L:L2。 23 } 24 25 公衆 静的 ボイドメイン(文字列[]引数){ 26 チャー C [] = { '3'、 '1'、 '4'、 '2'、 '3' }。 27 Long_listのLL = 新しいLong_list()。 28 のSystem.out.println(ll.list(c)参照)。 29 } 30 }