求助,90分
查看原帖
求助,90分
939931
Addicted_Game楼主2023/10/28 10:51
#include<bits/stdc++.h>
using namespace std;
const long long MOD=1e9+7;
long long k;
long long c[25];
//string t;//初始状态 
long long zt[15][15][15][15][15][15];//十年OI一场空,数组开小见祖宗
long long sl[15];
//map<string,long long> m;
long long dfs(long long s1,long long s2,long long s3,long long s4,long long s5,long long la){//十年OI一场空,不开longlong见祖宗 
	//cout<<s1<<" "<<s2<<" "<<s3<<" "<<s4<<" "<<s5<<endl;
	if(zt[s1][s2][s3][s4][s5][la]!=-1) return zt[s1][s2][s3][s4][s5][la];
	if(!s1&&!s2&&!s3&&!s4&&!s5) return 1;
	long long sum=0;
	/*
	乘法原理
	如果可以dfs
	那么每种这个颜色的颜料都来一次
	如果上一个和他是一个颜色
	那么就减少1 
	//使用之后,数量减少到下一个等级 
	*/
	if(s1) sum=(sum+(s1-(la==2))*dfs(s1-1,s2,s3,s4,s5,1)%MOD)%MOD;
	if(s2) sum=(sum+(s2-(la==3))*dfs(s1+1,s2-1,s3,s4,s5,2)%MOD)%MOD;
	if(s3) sum=(sum+(s3-(la==4))*dfs(s1,s2+1,s3-1,s4,s5,3)%MOD)%MOD;
	if(s4) sum=(sum+(s4-(la==5))*dfs(s1,s2,s3+1,s4-1,s5,4)%MOD)%MOD;
	if(s5) sum=(sum+s5*dfs(s1,s2,s3,s4+1,s5-1,5)%MOD)%MOD;
	zt[s1][s2][s3][s4][s5][la]=sum%MOD;
	return sum;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>k;
	for(long long i=1;i<=k;i++){
		cin>>c[i];
		sl[c[i]]++;//同种颜色数量 
	}
	memset(zt,-1,sizeof zt);
	long long jg=dfs(sl[1],sl[2],sl[3],sl[4],sl[5],-1)%MOD;
	cout<<jg;
	return 0;
}

2023/10/28 10:51
加载中...