NOIP P1063エネルギーのネックレス

タイトル説明

火星M A R&LT 惑星S上、各火星M A R&LT Sファンエネルギーはネックレスの文字列を着用します。そこネックレスN Nビーズ粒子エネルギー。エネルギービーズはヘッドとテールマークラベルされたビーズを持って、これらのマークは、正の整数に対応しています。そして、隣接する二つのビーズのために、マーカーの終了前にビーズは、ビーズの後の最初のマークと同じでなければなりません。唯一このように、吸引カップ(吸盤である火星M A R&LT エネルギーの放出がチャックによって吸収することができるが、アクション、2つのビードがビードに重合する人間の吸収器官のエネルギー)。前者ヘッドエネルギー標識されたビーズは、場合M M、尾標識R&LT R、R標識ビーズの頭部のエネルギー、標識された尾のn その後の重合後に放出されるエネルギーのN、Mの\時間はN \回rはM × R&LT × N-(火星M R&LT S単位)、新たに生成されたヘッダ標識ビーズm個のM、尾標識N- N-。

必要なとき、火星M A R&LTのS人々吸引カップグリップ二つの隣接するビーズは、次ビーズネックレスまで左まで、エネルギーを重合して得られます。もちろん、重合GETの異なる順序の総エネルギーは、あなたがリリースされた最大総エネルギーのうちのネックレスを作るための重合の順序を設計し、異なっています。

例えば:う。N = 4 N = 4、4 。4尾ヘッドビーズが標識されたマーク(2,3)、(3,5)、(5,10)、(10,2)、 2 3 3 5 5 1 0 )、 1 0 2 )。我々は2個のビーズの重合操作、(⊕シンボル使用J j⊕ のk k)を表すJ、K J 重合kは解放後のエネルギー2つのビードを。次いで、第4 4 1 2つのビードの重合エネルギの放出後:

4 4⊕ 1 1)10 \倍2 \回3 = 60 = = 1 0 × 2 × 3 = 6 0。

このネックレスは解放最適値がある重合のための総エネルギーになります

((4 4⊕ 1 1)⊕ 2 2)⊕ 3 3)= 10、\ 2倍\回3 + 10 \倍3 \ 5倍+ 10 \ 5倍\回10 = 710 1 0 × 2 × 3 + 1 0 × 3 × 5 + 1 0 × 5 × 1 0 = 7 1 0。

入力形式

最初の行は正の整数であるN(4≤N≤100)N 4 N 。1 0 0 )、ネックレス上のビーズの数を示します。二行目は、N 、スペースで区切られた正の整数N、すべての数を超えない1000 。1 0 0 0 I iは数でI iはヘッドマークビーズ(1≤i≤N)を1 iがNの)、場合iがN < iが< Nを、第I Iビーズは、テールマークに等しくなければならない私+1を付けましたが、私は+ ビーズのheadタグを。N N標識されたビーズは、尾に等しくなければならない1 ビーズのheadタグ。

ビーズの順序については、あなたが判断できるように表にネックレス、クロス表示されない、任意に最初に指定されたビーズは、その後、時計回り他のビーズに順序を決定します。

出力フォーマット

正の整数E(E≤2.1\タイムズ(10)^ 9)E E 2 。1 × 1 0 。9 )、解放重合のための最適な総エネルギー。

サンプル入力と出力

入力#1
4 
2 3 5 10
出力#1

Fで[I] [j]はI〜jは、エネルギーを保存するためのアレイと組み合わされた最大間隔を表します

この問題のヒント:ループの問題に、選択することができ、(I + 1)%n個の方法、それがあってもよいn個の要素はコードを簡単にするために、2 * N個の要素に再びコピーされます。

コード:

#include <iostreamの>
する#include <cstdioを>
使用して名前空間STD、
INT A [205]、N-;
INT F [205] [205];
int型のmain()
{
scanfの( "%のD"、およびN-);
(INTのために私は= 1; <= N-I; I ++)
{scanfの( "%のD"、&A [I])は、[N- + I]は[I]は=;} //初期化
のためには、(INT I = 2; I <= N- + 1; Iは++)
{
(int型L = 1; Iは1- + 1 <= 2 * N-; L ++)// L間隔左端を表し、rは右端の間隔を表し
{
INT R&LTを= Iは1- + 1。 ;
(。; K <R&LT; INT 1 + L = K K ++)のために。最初から間隔//長さ1、長さnの間隔が徐々に更新される
[L] [R] = F [L] F MAX([r ]、F [L] [K] + F [K] [R&LT] + [L] * A [K] * A [R&LT]);
}
}
int型ANS = 0;
のために(INT I = 1; Iは< = N; iは++)ANS = MAX(ANS、F [i]は[iが+ N]); // の最大値を見つける
のprintf( "%のD"、ANSを);
}

おすすめ

転載: www.cnblogs.com/Youio-bolg/p/11344240.html
おすすめ