タイトル
[試験の制限
説明[タイトル]
林は大理石のコレクターだった、家庭での大理石の様々な色の$ N $のブロックの彼のコレクションは、$ iが$ a_iを$のための大理石の色のブロックを$。
しかし林は自宅でランダムに配置し、これらの石はあまりにも厄介だと思う、彼は一緒にすべて同じ色の石を置くことを望んでいます。
言い換えると、左端の色大理石の$ J $する$ L $は大理石の最初のブロックであれば、従来のリンが、右端、各色の$ J $に対する、並べ替え後、大理石を再配置するために必要色は、次にL $ $ $ R&LT大理石から最初の$大理石に、J $ $ $ R&LT大理石が$大理石されている、石の色は$ jは$です。
林よりもこれらの大理石重いが長すぎる大理石の重量に耐えることができないので、彼が唯一の隣接入れ替えることができますので、それぞれ2つの大理石を運びます。
私は林を扱う多くの時間が少なくともする必要があるか、尋ねますか?
[入力形式]
入力されたデジタルの$ N(2≤N≤4* 10 ^ 5)$、の最初の行は、大理石の総数を表します。
第二の入力行番号$ N $ののの$ A_1、A_2 ...、(1≤a_i≤20)$ $ I $は色のビー玉$ a_iを$を示しています。
[出力形式]
出力を扱うの数は、林の最小値が必要です。
[サンプル入力]
サンプル入力1 。7 。3 。4 2 。3 。4 2 2 サンプル入力2 。5 20である 。1つの 14 10 2 サンプル入力3 13である 。5 。5 。4 。4 。3 。5 。7 。6 。5 。4 。4 。6
[サンプル出力]
サンプル出力1 。3 サンプル出力2 0 の出力例。3 21であります
[問題解決の経験]
$ 4000ms $:ちょうどこの質問を持って、私は深くそのタイムリミットに惹かれたのですか?
だから、長い時間制限があることが必要暴力的な検索枯渇検索アルゴリズムああ
だから、サンプルコードの導入後に検索を開始します...
彼が遊びに来ていない検索の背中を打つので、このアルゴリズムは、このような偉大な途中で死亡していることを見つけます...
[コード]正ソリューション&
一つは、ほとんどのテンプレート圧力DPのタイトルのようであると言うことができます。
すべてのデータの範囲を見て、$1≤a_i≤20$、ほとんど極端な反対、$2≤N≤4* 10 ^ 5 $を見つけ、それは非常に大きい$ N $のための$ a_iをの$のために言うことができます。
$ 4000ms $:制限時間は膨大にあります。
だから、これはまだ何を示していますか?
内の1つまたは2つの距離が非常に小さい場合、データエントリに、他のデータと異常に大きく、一方
そして、制限時間と非常に緩いです
時間のために、問題を解決するための定数は非常に大きい(またはいくつかのシミュレーションタイトル)であります
スペースのために、配列を開くために、他の部屋には耐えられない場合
なお、この問題は、圧力DP形状であることを示し、及び目的は、これらの比較的少数に対して圧縮されます
さて、この状態の疑問?
このビットが1である場合$ dp_i $、$ Iドルこの状態で、私は色を$最初の$は、すべてされていることを示す、ためのビットのバイナリに変換するための、請求$ $ DP一次元アレイを定義した後Aまとめます
$のC_ {ijは} $初期状態で石の色の全ての色$ J $ $ I $石の正面を表す$ Cは$、の二次元アレイ定義の、そして数
そこバイナリ伝達方程式$$ dp_i = dp_ {I-(1 << J)} +コスト(j)を形作る$$ J $ $ $ I $は、ビット数がためであります
胡口まだそれほど難しく以下のコード
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#defineは長いlong int型 4 の#define CG(C = GETCHAR()) 5インラインINT qread(){ 6 INT X、F = 1。char型のC; 7 一方(CG < ' 0 ' || ' 9 ' <c)の場合(C == ' - ')、F = - 1 。 8 用の(X =(C ^ 48)、' 0 '<= CG && C <= ' 9 ' ; X =(X << 1)+(X << 3)+(C ^ 48 ))。 9 リターンのx *のF。 10 } 11 の#undef CG 12テンプレート< クラス T>インラインT MAX(CONST T Xを、CONST TのY){ 戻り X> Yの?X:Y;} 13テンプレート< クラス T>インラインT MIN(CONST T Xを、CONST TのY){ 戻り X <Yを?X:Y;} 14テンプレート< クラス T>インラインT FAB(CONSTT X){ リターン X> 0 X:? - X;} 15 のconst int型 MAXN = 4E5。 16 CONST INT INF = 1LL << 60 。 17 のconst int型 MAXA = 25 。 18 INT [MAXN + 5 ]、N、MAXX。 19 int型 CNT [MAXA + 5 ]、C [MAXA + 5 ] [MAXA + 5 ]。 20 int型 DP [(1 << 20)+ 5 ]。 21は 主符号付き(){ 22 N =qread(); 23 のために(int型 I = 1 - MAXX = MAX([I] = qread()、MAXX);私は= Nを<++ I); [I] 24 のために(int型 i = 1 ; iが= Nを<; ++ i)が{ 25 ++ CNT [I]]。 26 のために(INT J = 0 ; J <= MAXX; ++ j)はC [J] [I] + = CNT [J]。 27 } 28 のための(int型 i = 0 ; iが=(< 1)<< MAXX - 1 ; ++ I)DP [I] = INF。 29 DP [ 0 ] = 0 。 30 のために(int型 i = 1 ; iが=(< 1 << MAXX) - 1 ; ++ i)のための(INT J = 0 ; J <MAXX; ++ j)の場合(I&(1 << J)){ 31 INTのコスト= 0、事前= I-(1 << J)。 32 のための(int型のk = 0 ; K <MAXX; ++、K)であれば(プリ&(1 << k))をコスト+ = C [J] [K]; 33 DP [I] = MIN(DP [I]、DP [事前] + コスト)。 34 } 35 のprintf(" %のLLDを\ n "、DP [(1 << MAXX) - 1 ])。 36 リターン 0 。 37 }