起初推了半天公式。。头都打了
后来发现可以dp,也就是递归的方式来求,定义dp[i][j]是前i行涂了j块,且这i行都有被涂色色块的合法方案数目,那么dp[i][j]来源于两种,一种是dp[i][j-1]即前i行合法地涂了j-1个,那么剩下2*i-(j-1)都是可以涂的,所以是dp[i][j-1]*(2*i-j+1);另一种是dp[i-1][j-1],即前i-1行合法地涂了j-1个,那么我可以涂到这i-1行的上面一行中的任意一个,也可以涂到下面一行的任意一个,所以是dp[i-1][j-1]*4
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define LL long long
using namespace std;
const double pi=acos(-1);
const int Mod=1e9+7;
LL dp[1010][2020];
int n;
int main()
{
for(int i=1;i<=1000;i++)
{
for(int j=i;j<=2*i;j++)
{
if(i==1)dp[i][j]=2;
else
{
dp[i][j]=((dp[i][j-1]*(2*i-j+1)%Mod)+(dp[i-1][j-1]*4)%Mod)%Mod;
}
}
}
while(cin>>n)
{
if(n==0)break;
cout<<dp[n][2*n]<<endl;
}
}