您的位置:首页 > 运维架构

OpenJudge1413 Mondriaan's Dream

2015-10-31 16:52 148 查看
题目:http://noi.openjudge.cn/ch0405/1413/

分析:DP.二进制按位压缩,此位向下伸出为1,不伸出为0,f[i][j]表示i行状态为j时的方案数,则f[0][0]=1;答案即为f
[0].

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=15,Tmax2=2055;
int n,m,top;
long long int f[Tmax][Tmax2];
bool check(int s,int x)
{
int i,now=-1;
for(i=0;i<m;i++)
{
if((s&(1<<i))&&(x&(1<<i))) return false;
if((s&(1<<i))||(x&(1<<i))){
if((i-now-1)%2!=0) return false;
now=i;
}
}
if((m-now-1)%2!=0) return false;
return true;
}
void work()
{
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=0;j<=top;j++)
{
if(f[i-1][j]==0) continue;
for(k=0;k<=top;k++)
if(check(j,k)) f[i][k]+=f[i-1][j];
}
}
printf("%lld\n",f
[0]);
return;
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)==2&&n!=0)
{
if((n*m)%2!=0){
printf("0\n");
continue;
}
memset(f,0,sizeof(f));
f[0][0]=1;
top=(1<<m)-1;
work();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: