zoukankan      html  css  js  c++  java
  • poj 2411 Mondriaan's Dream 轮廓线dp

    题目链接:

    http://poj.org/problem?id=2411

    题目意思:

    给一个n*m的矩形区域,将1*2和2*1的小矩形填满方格,问一共有多少种填法。

    解题思路:

    用轮廓线可以过。

    对每一个格子,枚举上一个格子的状态,得到当前格子的所有状态值。

    dp[cur][s]表示当前格子的轮廓线状态为s的情况下的总数

    代码:

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<set>
    #include<stack>
    #include<list>
    #include<queue>
    #define eps 1e-6
    #define INF 0x1f1f1f1f
    #define PI acos(-1.0)
    #define ll long long
    #define lson l,m,(rt<<1)
    #define rson m+1,r,(rt<<1)|1
    using namespace std;
    
    /*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    */
    ll dp[2][1<<15]; //dp[cur][s]表示当前格子的轮廓线状态为s的情况下的总数
    int n,m,cur;
    
    void update(int a,int b)
    {
       if(b&(1<<m)) //将前一个格子的最高位,如果是1,则置零,并更新
          dp[cur][b^(1<<m)]+=dp[1-cur][a];
    }
    int main()
    {
       while(scanf("%d%d",&n,&m)&&m+n)
       {
          //if(m+n)
          if(m>n)
             swap(n,m);
          memset(dp,0,sizeof(dp));
          dp[0][(1<<m)-1]=1; //第一行只能横着放,把这个状态初始化为1
          cur=0;
          int lim=1<<m;
    
          for(int i=0;i<n;i++)
             for(int j=0;j<m;j++) //对每个格子,从前面一个格子推过来
             {
                cur^=1;
                memset(dp[cur],0,sizeof(dp[cur]));
                for(int k=0;k<lim;k++) //枚举前一个格子的所有状态
                {
                   update(k,k<<1); //不放
                   if(i&&!(k&(1<<(m-1))))//竖着放
                      update(k,(k<<1)^(1<<m)^1); //将放着的两点置1
                   if(j&&!(k&1))
                      update(k,(k<<1)^3); //横着放
                }
             }
          printf("%lld
    ",dp[cur][lim-1]);
       }
       return 0;
    }
    
    



  • 相关阅读:
    archlinux .bash_history
    Ubuntu环境下挂载新硬盘
    软碟通 UltraISO U启替代品 Win32DiskImager 无设备 无盘符 无u盘 无优盘 解决方案 之diskpart
    delphi Integer overflow
    MSBuild Tools offline
    delphi synedit免费的拼写检查器dll
    git 自定义命令行
    lua编译
    gcc ar
    Windows Subsystem for Linux (WSL)挂载移动硬盘U盘 卸载 c d 盘
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3202911.html
Copyright © 2011-2022 走看看