1 #include<cstdio> 2 #include<iostream> 3 #define M 1000000007 4 using namespace std; 5 int f[16][16][16][16][16][6],ma[16][16][16][16][16][6],a[6],k; 6 long long dp(int a1,int a2,int a3,int a4,int a5,int a6) 7 { 8 if(a1+a2+a3+a4+a5==0) 9 return 1; 10 if(ma[a1][a2][a3][a4][a5][a6]) 11 return f[a1][a2][a3][a4][a5][a6]; 12 long long s=0; 13 if(a1) 14 s+=(a1-(a6==2))*(dp(a1-1,a2,a3,a4,a5,1)); 15 if(a2) 16 s+=(a2-(a6==3))*(dp(a1+1,a2-1,a3,a4,a5,2)); 17 if(a3) 18 s+=(a3-(a6==4))*(dp(a1,a2+1,a3-1,a4,a5,3)); 19 if(a4) 20 s+=(a4-(a6==5))*(dp(a1,a2,a3+1,a4-1,a5,4)); 21 if(a5) 22 s+=a5*(dp(a1,a2,a3,a4+1,a5-1,5)); 23 ma[a1][a2][a3][a4][a5][a6]=1; 24 return f[a1][a2][a3][a4][a5][a6]=s%M; 25 } 26 int main() 27 { 28 scanf("%d",&k); 29 for(int i=1;i<=k;i++) 30 { 31 int a1; 32 scanf("%d",&a1); 33 a[a1]++; 34 } 35 printf("%lld",dp(a[1],a[2],a[3],a[4],a[5],0)); 36 return 0; 37 }
dp 由于每种颜色个数很少且具有相同个数的颜色在一定意义上是一样的 所以我们可以用这个dp,开一个六维数组,前五维分别存还有1,2,3,4,5个的颜色的数量,第六维存是从哪
转移来的。觉得记忆化搜索比较好写。