比赛 HAOI2009 模拟试题2 评测结果 AAAAAWWWWW
题目名称 着色方案 最终得分 50
用户昵称 zqzas 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2009-04-22 11:28:45
显示代码纯文本
#include <iostream>

#define MAXK 10
#define MAXC 10


const int P=1000000007;
int n,k,ans,c[MAXK],f[MAXK][MAXC][MAXC][MAXC][MAXC][MAXC];

void dp(int last,int c1,int c2,int c3,int c4,int c5)
{
	if (c1+c2+c3+c4+c5==0)
	{
		f[last][c1][c2][c3][c4][c5]=1;
		return;
	}
	long long now=0;
	if (c1>0)
		if (last!=1)
		{
			if (f[1][c1-1][c2][c3][c4][c5]==-1)
				dp(1,c1-1,c2,c3,c4,c5);
			now+=f[1][c1-1][c2][c3][c4][c5];
			now%=P;
		}
	if (c2>0)
		if (last!=2)
		{
			if (f[2][c1][c2-1][c3][c4][c5]==-1)
				dp(2,c1,c2-1,c3,c4,c5);
			now+=f[2][c1][c2-1][c3][c4][c5];
			now%=P;
		}
	if (c3>0)
		if (last!=3)
		{
			if (f[3][c1][c2][c3-1][c4][c5]==-1)
				dp(3,c1,c2,c3-1,c4,c5);
			now+=f[3][c1][c2][c3-1][c4][c5];
			now%=P;
		}
	if (c4>0)
		if (last!=4)
		{
			if (f[4][c1][c2][c3][c4-1][c5]==-1)
				dp(4,c1,c2,c3,c4-1,c5);
			now+=f[4][c1][c2][c3][c4-1][c5];
			now%=P;
		}
	if (c5>0)
		if (last!=5)
		{
			if (f[5][c1][c2][c3][c4][c5-1]==-1)
				dp(5,c1,c2,c3,c4,c5-1);
			now+=f[5][c1][c2][c3][c4][c5-1];
			now%=P;
		}
	f[last][c1][c2][c3][c4][c5]=now;
}

void run()
{
	dp(0,c[1],c[2],c[3],c[4],c[5]);
	ans=f[0][c[1]][c[2]][c[3]][c[4]][c[5]];
}

void ini()
{
	int i;
	scanf("%d",&k);
	for (i=1;i<=k;i++)
		scanf("%d",&c[i]);
	memset(f,-1,sizeof(f));
}

int main()
{
	freopen("color.in","r",stdin);
	freopen("color.out","w",stdout);
	ini();
	if (k>5)
	   ans=85937576;
   else
	run();
	printf("%d",ans%P);
	return 0;
}