Java蒙德里安动态图_AcWing 291. 蒙德里安的梦想 java

import java.util.*;

class Main{

static int N=12;

static int M=1<

static boolean[] st=new boolean[M];

static long[][] f=new long[N][M];

public static void main(String[] args){

Scanner sc=new Scanner(System.in);

while(true){

int n=sc.nextInt();

int m=sc.nextInt();

if(n==0&&m==0)break;

ArrayList> state=new ArrayList>(); //每次都要刷新

for(int i=0;i

int cnt=0;

boolean is_valid=true;//中间量用来暂存是否有效

for(int j=0;j

if((i>>j&1)!=0){//当遇到1时说明连续的0结束了,然后判断一下0的个数,如果是奇数置为不合法

if((cnt&1)!=0){

is_valid=false;

break;//如果不合法,说明已经有连续0的个数是奇数,不满足条件了

}

cnt=0;

}

else{

cnt++;//计数0的个数

}

}

if((cnt&1)!=0)is_valid=false;

st[i]=is_valid;

}

for(int i=0;i

ArrayList list =new ArrayList();

for(int j=0;j

if((i&j)==0&&st[i|j]==true){

list.add(j);

}

}

state.add(list);//

}

for(int i=0;i

Arrays.fill(f[i],0);

}

f[0][0]=1;//初始值为1,只可以是状态为0的

for(int i=1;i<=m;i++){//

for(int j=0;j

for(int x:state.get(j)){

f[i][j]+=f[i-1][x];//状态计算就是将前面的所有状态都累加起来。

}

}

}

System.out.println(f[m][0]);//0-m-1列都已经填充完成,而且没有延申到m列的,说明恰好填满了。

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值