これは動的プログラミングの質問のように感じます。
文章の k 個の単語が、各単語の間に電球を挟んで隣り合わせに配置されていることを想像できます (つまり、合計で k-1 個の電球)。電球が点灯している場合は、それに隣接する単語が単一のフレーズの一部であることを意味し、消灯している場合はそうではありません。したがって、これらの電球の任意の構成は、重みの可能な組み合わせを示しています。もちろん、必要なフレーズのスコアがないため、多くの構成は不可能です。したがって、k-1 個の電球は、最大 2^(k-1) 個の可能な答えがあることを意味します。
総当たりではなく、他の計算に再利用できる各計算の部分があることを認識することができます。 .. 怠惰な犬)、(茶色のキツネ ... 怠惰な犬) の最大スコアを一度だけ計算し、それをメモして、次にそれを見たときに余分な作業をせずに再利用できます。
始める前に、まず、可能な値が 1 つしかない電球を取り除く必要があります (「brown fox」というフレーズや、そのフレーズを含むより大きなフレーズがないと仮定すると、「brown fox」の間の電球が削除されます)。 ' および 'fox' は常にオフにする必要があります)..削除された各電球は、ソリューション スペースを半分にします。
w1、w2、w3 が単語の場合、電球は w1w2、w2w3、w3w4 などになります。
Optimal(w1w2 w2w3 w3w4 ...) = max(Optimal(w2w3 w3w4 ...) given w1w2 is on, Optimal(w2w3 w3w4 ...) given w1w2 is off)
(可能な解決策がない場合は注意してください。MIN_INT を返すだけで、うまくいくはずです)
このように問題を解決することもできますが、電球に近づく順序を賢く使えば、おそらくさらに時間を節約できます。最初に中央の球根を攻撃すると役立つかもしれません.. この部分についてはよくわかりません。