トピックへのリンク:https://www.lydsy.com/JudgeOnline/problem.php?id=1079
ACコード:
1 / * 2 私たちは色が同じ制限ではありません考慮すれば、直接圧縮状態は、明らかに現実的ではありません、それに隣接していない 3 木片の数が同じの2つの塗料を染色することができるならば、我々は2つの塗料なしの違いを考慮することができます。 図4は、 DPを設け[A1]、[A2] [ A3] [A4] [A5] 塗料をブロックするプログラム...... A1種の数を有するトランスフェクトすることができます。 5は 色の最後の数Kをペイントするために使用される場合でも、隣接の限界色がある 6 、K-1色塗料の数があり、この時間は、場合転送ノート、使用することができません。 7 * / 8ザには、#<入出力ストリーム> 。9ザには、#<stdio.hの> 10#ザは<含む文字列 .H> 11ザは<アルゴリズム>含む位 12であるザには、#<ビット集合> 13であるザには、#<ctimeの> 14位ザが<climits>含む 15#<含めるSET > 16#には、<地図> 17の#を含む<CCTYPE> 18位<cmath>含む 19の#には、<両端キュー> 20の#を含む<キュー> 21#含める<積層> 22#含める<ベクトル> 23の#を含む<機能> 24 使って 名前空間をSTD; 25 26のtypedef 長い 長LL。 27 のconst int型 MAXN = 16 。 28 CONST LL MOD = 1E9 + 7 。 29 int型 N、X [ 16 ]。 30 LLのF [ 16] [ 16 ] [ 16 ] [ 16 ] [ 16 ] [ 6 ]; /// .... bがコーティングされ回塗装する前に、Fアレイは、再び現在塗装を表すことができkは時間がコーティングペイントができる 31は BOOL DP [ 16 ] [ 16 ] [ 16 ] [ 16 ] [ 16 ] [ 6 ]; 32 33である LL Dpを(int型、int型 B、int型 C、int型 D、int型の E、INTをK) 34は、 { 35 LL T = 0 ; 36 IF(DP [A] [B] [C] [D] [E] [K]) 37 戻りFを[A] [B] [C] [D] [E] [K]; 38で IF(A + B + == E + D + C 0 ) 39 リターン 1。; 40 IF (A) 41は T = T +(A-(K == 2))* Dpを(A- 1、B、C、D、E、1。 )。/// 色の一種が、1つのブロックに染色することができる2を用いた塗色の最後の数は、この時間は、色数1が存在する場合、ブロック0(a-1となるよう)にトランスフェクトすることができます塗料を使用することができない 42で IF (B) 43である T = T +(B-(K == 3。 * Dpの(+))1、B- 1、C、D、E、2); ///染料の色の一種は、ブロックにトランスフェクトすることができる2つのブロック(A + 1、B-1程度)とすることができ 、 塗料を使用して、3色の最後の数、この時間は、色数2が存在する場合塗料を使用することができない 44は IF (C) 45 T = T +(C-(K == 4。 * Dpと(B +)の)1、C- 1、D、E、3。); /// 方法を色色素3つのキューブがブロック2に染色することができる(したがって、C-1、B + 1) 、 4をペイントするために使用される色の最後の番号は、この時間は、塗料の色の数が3である場合使用されていない 46で IF (D) 47 T = T +(D-(K == 5))* Dpを(、B、C + 1、D- 1、E、4); /// 色素の一種が4であってもよいですブロック色は、3個の立方体に染色することができる(したがって、D-1、C + 1) 、 5の最後の番号が塗色を使用する場合、この時間は、色数が4の描画に使用することができない存在であります 48 IF (E) 49 + E = T * T Dpは(A、B、C、D + 1、E- 1、5。); /// 色の一種は、4つのブロック(それはE-1にトランスフェクトすることができる5つのブロックを、染色することができます、D + 1)、被写体条件ので、それは、箱5の色で染色することができる場合。1 <= CI <= 5ので、説明は彼が以前に使用されてきてはならない 50 DP [A] [B] [C]を[ D] [E] [K] = 1; 51は、 戻り F [A] [B] [C]を[D]、[E] [K] =(T%のMOD) 52である } 53である 54である INT (メイン) 55 { 56であります scanf関数(" %のD "、およびN-); 57である ため(INT I = 1 ; Iは<= N-I ++ ) 58 { 59 INTY; 60 のscanf(" %dの"、&Y) 61 X [Y] ++ ; 62 } 63 のprintf(" %LLDする\ n "、Dpは(X [ 1 ]、X [ 2 ]、X [ 3 ]、X [ 4 ]、X [ 5 ]、0 )); 64 リターン 0 ; 65 }