색칠 프로그램 (+ 메모리 동적 프로그래밍 됨)

주제 링크 : https://www.lydsy.com/JudgeOnline/problem.php?id=1079

AC 코드 :

1  / * 
2      우리는 컬러가 아닌 동일한 제한이, 인접없는 고려할 경우 직접 압축 상태 분명히 가능하지
 3      나무 조각의 개수가 동일한 두 페인트 염색 할 수있는 경우, 우리는 두 페인트에 차이점을 고려할 수있다.
4      DP 제공 [A1] [A2] [ A3] [A4] [A5] 페인트를 차단하는 프로그램 ...... A1 종의 번호를 가지고 형질 감염 될 수있다.
5      색의 마지막 번호는 K 페인트를 사용하지만, 인접한의 한계 컬러가
 6      K-1 색 페인트의 번호가 다음이 시간이 때 전사 참고 사용될 수 없다.
. 7  * / 
. 8 # 1 기호 <iostream>를 포함한다
 . (9) # (가) <STDIO.H가> 등
 (10) (가)가 포함 # < 문자열 .H>
 . (11) (가)가 포함 # <알고리즘>
 (12)는 (가)가 포함 #은 <비트 세트>
 13되는 (가)가 포함 #은 <ctime이>
 14 중 # 포함 <climits는>
 15 (가) # 포함 < SET >
 (16)# 포함 <지도>
 17 # 포함 <cctype>
 18 # 1 <cmath> 포함하는
 19 # 포함 <양단>
 20 # 포함 <큐>
 21 # 포함 <적층>
 22 # 포함 <벡터>
 23 # 포함 <작용>
 24  사용  공간을 표준;
(25)  
(26) 의 typedef  LL;
27  CONST의  INT의 maxn = 16 ;
28  CONST LL의 개조 1E9 + = 7 ;
29  INT의 N, X [ 16 ];
30 LL의 F [ 16[ 16 ] [ 16 ] [ 16 ] [ 16 ] . 6 ] /// 이 회 그린 전에 F 어레이 B가 코팅이다 .... 번 현재 페인트 코팅을 나타낼 수 k는 시간 코팅 그릴 수 
31 인  BOOL DP [ 16 ] [ 16 ] [ 16 ] [ 16 ] [ 16 ] . 6 ]
 (32)  
(33)는 LL DP ( int로 A, INT의 B, INT의 C, INT의 D, INT의 E, 지능 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를 사용할 경우 색의 한 종류가 하나 개의 블록으로 염색 할 수 있고, 블록 0에 형질 감염 될 수있다,이 시간은 컬러 숫자가 페인트를 사용할 수없는 
42      IF (B)
 (43)는          T = T + (B- (K == 3. * DP (a +)) 1. , B- (1). , C, D, E, 2 ) ///염료 색 1 종 블록으로 형질 감염 될 수있는 두 개의 블록이 될 수있다 (따라서, B-1, A + 1) , 3 색의 마지막 번호가 도료를 사용하는 경우, 이번에는 컬러 번호 2가 페인트를 사용할 수 없다 
(44)는      IF (C)
 45          T = T +합니다 (C- (K == 4. * DP (A, 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는 (A, B는 C + 1. , D- 1. , E는 4. ) /// 염료의 1 종 4 일 수있다 블록의 색은 3 개 큐브로 염색 될 수있다 (따라서 D-1, C + 1) , (5)의 마지막 숫자는 페인트 색상을 사용하는 경우,이 시간은 컬러 번호 4 도장하는데 사용될 수있다 
48      IF (E)
 (49)         + E = T * T DP (A, B, C, D + 1. , E- 1. , 5. ) /// 컬러의 1 종류 (그것의 E-1 다섯 개 블록, 즉 4 개 개의 블록으로 형질 감염 될 수 염색 할 수있다 , 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          INT와이;
60          는 scanf ( " %의 D ' , Y);
61          X [Y] ++ ;
62      }
 63      의 printf ( " % LLD \ 없음 " , DP (X [ 1 ], X [ 2 ], X [ 3 ], X [ 4 ], X [ 5 ], 0 ));
64      반환  0 ;
65 }
코드보기

 

추천

출처www.cnblogs.com/wsy107316/p/11330732.html