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]);
        }
    }
}
posted @ 2021-07-14 21:59  zhuangzhongxu  阅读(34)  评论(0)    收藏  举报