传送门:http://codeforces.com/gym/100015/attachments
已知一个2*n的网格,按要求染色,第一个可以随便染,之后的必须和已经染色的相邻,斜着也算相邻,求染色方案数%1000000007
还是dp
f[i][j]表示i行j个,显然i<=j<=2*i
然后f[i][j]从两个状态转移,一个是另开一行,有四个位置可以染色 f[i][j]+=f[i-1][j-1]*4
或者在i行中继续染色,有2*i-j+1个位置 f[i][j]+=f[i][j-1]*(2*i-j+1)
初始条件是f[1][1]=2,f[1][2]=2
代码如下:
#include<cstdio>
#include<cstring>
#define MOD 1000000007
using namespace std;
int n;
long long f[1005][2005];
int main()
{
while (1)
{
scanf("%d",&n);
if (!n)
{
break;
}
memset(f,0,sizeof(f));
f[1][1]=2;
f[1][2]=2;
for (int i=2;i<=n;i++)
{
for (int j=i;j<=2*i;j++)
{
f[i][j]+=f[i][j-1]*(2*i-j+1);
f[i][j]+=f[i-1][j-1]*4;
f[i][j]%=MOD;
}
}
printf("%I64d\n",f[n][2*n]%MOD);
}
return 0;
}