私はここでこの質問に答えました:グーグルインタビュー:ポリゴンの最大合計を見つけてください、そしてその質問はこれの複製であると私に指摘されました。まだ誰もこの質問に完全に答えていないので、ここにもこの答えを追加することにしました。
正しく識別(タグ付け)したように、これは実際に行列の乗算の問題と非常によく似ています(すばやく実行するために、どの順序で行列を乗算しますか)。
これは、動的アルゴリズムを使用して多項式で解くことができます。
代わりに、同様の、より古典的な(そして同一の)問題を解決します。数値、加算、乗算を含む数式が与えられた場合、それを括弧で囲む方法によって最大値が得られます。たとえば、
は以上になり6+1 * 2
ます。(6+1)*2
6+(1*2)
入力a1 to an
実数とo(1)、... o(n-1)のいずれか*
またはを示し+
ます。私たちのアプローチは次のように機能します。a1、... ajの最大式(括弧を付けた後)を表すサブ問題F(i、j)を観察します。このようなサブ問題のテーブルを作成し、F(1、n)がまさに私たちが探していた結果であることを確認します。
定義
F(i,j)
- If i>j return 0 //no sub-formula of negative length
- If i=j return ai // the maximal formula for one number is the number
- If i<j return the maximal value for all m between i (including) and j (not included) of:
F(i,m) (o(m)) F(m+1,j) //check all places for possible parenthasis insertion
これはすべての可能なオプションを通過します。正しさの証明は、サイズn = jiでの誘導によって行われ、非常に簡単です。
ランタイム分析を行いましょう:
小さなサブ問題の値を動的に保存しない場合、これはかなり遅くなりますが、このアルゴリズムを比較的速く実行することができます。O(n^3)
インデックスi、jのセルにF(i、j)が含まれる* nテーブルTを作成します。ここで、iよりも小さいjのF(i、i)とF(i、j)を埋めます。これらの値を直接計算できるため、各セルは対角線上に移動してF(i + 1、i + 1)を入力します(再帰式の以前のすべての値がすでにわかっているため、これをすばやく実行できます)。このnを繰り返します。 n個の対角線(実際にはテーブル内のすべての対角線)の回数と各セルの塗りつぶしには(O(n))が必要です。各セルにはO(n)セルがあるため、各対角線をO(n ^ 2)で塗りつぶします。つまり、すべての対角線を塗りつぶします。 O(n ^ 3)のテーブル。表に記入した後、問題の解決策であるF(1、n)が明らかにわかります。
今、あなたの問題に戻ります
ポリゴンをn
さまざまな数式(各頂点から開始する数式)に変換し、数式値のアルゴリズムを実行すると、必要な値が正確に得られます。