SDNU 1178エネルギーネックレス(間隔DP)

説明

火星では、火星すべての人は、エネルギーのネックレスの束を着用すること。ネックレスエネルギーのビーズのN個があります。エネルギービーズはヘッドとテールマークラベルされたビーズを持って、これらのマークは、正の整数に対応しています。そして、隣接する二つのビーズのために、マーカーの終了前にビーズは、ビーズの後の最初のマークと同じでなければなりません。エネルギーの放出がチャックによって吸収されてもよいだけこのように、吸引カップ(吸盤臓器火星ヒトエネルギー吸収である)効果、2つのビードは、ビードに重合します。前者ヘッドエネルギーはビーズmを標識した場合、ポストアンブルをr、R標識されたビーズ、テールマークのヘッドのエネルギーをnと、次いで(火星単位)をリリース重合エネルギーの後、ビーズを新たに生成しましたヘッドは、テールマークがnであり、mとなりました。
必要な場合には、隣接する二つのビーズをクランプ吸盤と火星人は、次のビーズのネックレスまで左まで、エネルギーを重合して得られます。もちろん、重合GETの異なる順序の総エネルギーは、あなたがリリースされた最大総エネルギーのうちのネックレスを作るための重合の順序を設計し、異なっています。
例:N =頭部および尾部標識4,4ビーズを標識した(2,3)、(3,5)、(5,10)、(10,2)とします。我々は、重合が解放後に2つのビードをK、2つのビード重合操作、(j⊕k)Jのエネルギーを表す⊕シンボルを使用します。最初の2つのビードによって解放重合エネルギーの後4,1です。
(4⊕1)10 * 2 * 3 = 60 =。
このネックレスは、最適値を発表した重合のための総エネルギーすることができ
((4⊕1)⊕2)⊕3)= 710 * 2 10 * 3 + 10 * 3 * 5 + 10 * 5 * 10 =。

入力

最初の入力ラインは、正の整数N(4≤N≤100)であるネックレス上のビーズの数を表します。第二のラインは1,000全ての数以上ではない、nは正の整数の空間によって分離されています。ビードの端部をマーキングiがN <スパン<I番目(1≤i≤N)の第1のビード、>のi番目のタグは、ビーズのI + 1ヘッドマークIに等しくなければなりません。N標識ビーズは、標識されている第1のビードのヘッドエンドに等しくなければなりません。
ビーズの順序については、あなたが判断できるように表にネックレス、クロス表示されない、任意に最初に指定されたビーズは、その後、時計回り他のビーズに順序を決定します。

出力

唯一のライン出力は、正の整数E(E≤2.1* 109)、解放重合のための最適な総エネルギーです。

サンプル入力

4 
2 3 5 10

サンプル出力

710

ソース

アイデア:DPの範囲を確認するために始めているが、理解していないと、3つのアレイのそれぞれの合計、またはどのように従事するために製品を維持することです。
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、

#defineっ長い長
 の#define EPS 1E-9
 の#defineパイACOS(-1)のconst int型 INF = 0x3f3f3f3f const int型のmod = 1000000007 ;
const int型 MAXN = 1000年 + 8 構造体ノード
{ INT M。
} [MAXN]。
LL DP [MAXN] [MAXN]。int型のn; INT メイン()
{ 
    のstd :: IOS :: sync_with_stdio(0 )。
    cin.tie(

   


    



0 )。
    cout.tie(0 )。
    cinを >> N;
    以下のためにint型 i = 1 ; iが<= N; iは++ 
    { 
        CIN >> [I] .M。
        A [iが + N] .M = [I] .M。
    } 
    のためのINT LEN = 2 ; LEN <= N; LEN ++)/// 长度
    {
         ためint型 i = 1 ; iは+ LEN - 1 < 2 * N; iは++)/// 起点
        {
             INTEN =私はlenの+ - 1/// 终点 
            DP [I] [EN] = - INF。
            以下のためにint型 K = I; kは<EN ++ k個
                [I] [EN] DPを = MAX(DP [I] [EN]、DP [I] [K] + DP [K + 1 ] [EN] + Aを[I] .M * [K + 1 ] .M * [EN + 1 ] .M)。
        } 
    } 
    LL MI = DP [ 1 ] [N];
    以下のためにint型 I = 2 iが++; iが<= N 場合 - (MI <DP [I] [I + N 1 ])
            MI = DP [I] [I + N - 1]; 
    coutの << MI << ' \ nを' ;
    リターン 0 ; 
} 
/ * 

* /

 

おすすめ

転載: www.cnblogs.com/RootVount/p/11502869.html
おすすめ