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;
}
已知一个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;
}
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow