プログラミングせずに、一般的な言葉で解決策を示します。
セグメントを s 1、s 2、...、s nとします。それらの始まりは b 1、 b 2、... b nであり、終わりは e 1、 e 2、... e nです。
b 1 < b 2 <...< b nのように、セグメントを先頭で並べ替えます。点を覆う 3 つのセグメントがないという条件が成立するかどうかを確認するだけで十分です。b 1から b nの順番でやっていきます。したがって、b 1から開始し、次の点に移動するというように 1 つずつ、ある点 b iでそれを覆う 3 つのセグメントが存在するまで続けます。これらは、s iと他の 2 つのセグメントになります。たとえば、s jと s kとします。これらの 3 つのセグメントのうち、最大の終点を持つセグメント、つまり max{e i , e j , e kを削除します。}。次のセグメント (b i+1 ) の先頭に移動します。b nに到達すると、プロセスは完了です。残されたすべてのセグメントは、セグメントの最大のサブセットを構成し、3 つのセグメントが共通点を共有することはありません。
これが最大サブセットになる理由。解が S (セグメントのセット) だとしましょう。最適解 S* があるとします。ここでも、S と S* のセグメントを開始位置の座標で並べ替えます。ここで、S と S* のセグメントを調べて、それらの終点を比較します。S の任意の k番目のセグメントに対する S の構成により、その終了座標はS*の k番目のセグメントの終了座標よりも小さくなります (e k <=e k )。したがって、S 内のセグメントの数は S 内よりも少なくありません(S* 内を移動すると、常に S を追い越します)。
これが十分に説得力がない場合は、最初に、2 つのセグメントが重なってはならない、より単純な問題について考えてみてください。解は同じですが、正しい答えが得られる理由をより直感的に理解できます。