java_day10
目标:Java web开发
问题:要用相同的的小方块填满一个大方块,数一数有多少种方案
8*10的方块,方案数1031151241
import java.util.*;
public class Main{//实打实的紫题,超出了我凡人能自己做出来的界限。
//仙术————状态压缩DP
static Scanner sc=new Scanner(System.in);
static int N=12,M=1<<N;
static long f[][]=new long[N][M];
static boolean st[]=new boolean[M];
public static void main(String args[]){
while(true){
int n=sc.nextInt(),m=sc.nextInt();
if(n==0||m==0) break;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++) f[i][j]=0;
for(int i=0;i<M;i++) st[i]=false;
//演算开始
for(int i=0;i<1<<n;i++){
st[i]=true;
int cnt=0;
for(int j=0;j<n;j++)
if((i>>j&1)!=0){
if((cnt&1)!=0) st[i]=false;
cnt=0;
}
else cnt++;
if((cnt&1)!=0) st[i]=false;
}
//下面开始累加
f[0][0]=1;
for(int i=1;i<=m;i++)
for(int j=0;j<1<<n;j++)
for(int k=0;k<1<<n;k++)
if((j&k)==0&&st[j|k])
f[i][j]+=f[i-1][k];
//加满了m列,伸出的状态是000000,也就是m+1列没有伸出去的
System.out.println(f[m][0]);
}
}
}

浙公网安备 33010602011771号