四川很喜欢dp啊,又是个神奇的dp。由于ci很小 我们可以以ci为维数,记下每个数量的油漆。由于不能有相同的颜色相邻我们要几下上次取的油漆属于哪一类。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define mod 1000000007
typedef long long sint;
int k,save[100],use[10],n;
sint f[16][16][16][16][16][6];
sint dfs(int a1,int a2,int a3,int a4,int a5,int last)
{
int sum=a1+a2+a3+a4+a5;
if(sum==0) return 1;
if(f[a1][a2][a3][a4][a5][last]) return f[a1][a2][a3][a4][a5][last];
sint tmp=0;
if(a1) tmp+=((a1-(last==2))*dfs(a1-1,a2,a3,a4,a5,1));
if(a2) tmp+=((a2-(last==3))*dfs(a1+1,a2-1,a3,a4,a5,2));
if(a3) tmp+=((a3-(last==4))*dfs(a1,a2+1,a3-1,a4,a5,3));
if(a4) tmp+=((a4-(last==5))*dfs(a1,a2,a3+1,a4-1,a5,4));
if(a5) tmp+=a5*dfs(a1,a2,a3,a4+1,a5-1,5);
f[a1][a2][a3][a4][a5][last]=tmp%mod;
return f[a1][a2][a3][a4][a5][last];
}
int main()
{
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
scanf("%d",&save[i]);
use[save[i]]++;
}
sint ans=0;
ans=dfs(use[1],use[2],use[3],use[4],use[5],0);
printf("%lld\n",ans);
return 0;
}