zoukankan      html  css  js  c++  java
  • Mondriaan's Dream

    题目大意:有一些1*2的矩形,现在用这些小矩形覆盖M*N的大矩形,不能重复覆盖,并且要覆盖完全,求有多少种覆盖方式。

    分析:可以使用1和0两种状态来表示这个位置有没有放置,1表示放置,0表示没有放置,可以有三种放置方式。

    一,竖着放。 二,不放。三,横着放。直接DFS这些情况就行了................还是递归容易理解。

    代码如下:

    =========================================================================================================

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    
    const int MAXN = 12;
    const int Bit = 11;
    
    long long dp[MAXN][1<<Bit];
    int M, N;
    
    void DFS(int row, int col, int now, int pre)
    {
        if(col == N)
        {
            dp[row][now] += dp[row-1][pre];
            return ;
        }
    
        if(col+1 <= N)
        {
            DFS(row, col+1, now<<1|1, pre<<1);///这一位竖着放
            DFS(row, col+1, now<<1, pre<<1|1);///这一位不放
        }
        if(col+2 <= N)
            DFS(row, col+2, now<<2|3, pre<<2|3);
    }
    
    int main()
    {
        while(scanf("%d%d", &M, &N) != EOF && M+N)
        {
            memset(dp, 0, sizeof(dp));
            if(N > M)swap(N, M);
    
            dp[0][(1<<N)-1] = 1;
    
            for(int i=1; i<=M; i++)
                DFS(i, 0, 0, 0);
    
            printf("%lld
    ", dp[M][(1<<N)-1]);
        }
    
        return 0;
    }
  • 相关阅读:
    Java类加载机制
    DAY18
    DAY17
    DAY16
    DAY15
    DAY14
    DAY13
    DAY12
    DAY11
    DAY10
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4851331.html
Copyright © 2011-2022 走看看