您的位置:首页 > 大数据 > 人工智能

Gym 100015B Ball Painting

2016-03-20 10:43 357 查看
传送门: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
[2*n]%MOD);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gym DP