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

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

    这道题用2进制表示1表示放0表示不放。第i行与第i-1行有关。枚举i-1行的每个状态,推出由此状态能达到的i行状态。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define maxn 500
     5 #define ll long long
     6 using namespace std;
     7 
     8 ll dp[maxn][5000];
     9 int h,w;
    10 ll ans=1;
    11 void dfs(int i,int t1,int num)
    12 {
    13     if(num==w) {dp[i][t1]+=ans; return;}
    14     dfs(i,t1,num+1);
    15     if(num<=w-2&&!(t1&1<<num)&&!(t1&(1<<(num+1)))) dfs(i,t1|1<<num|(1<<(num+1)),num+2);
    16 }
    17 
    18 int main()
    19 {
    20     while(scanf("%d%d",&h,&w)!=EOF)
    21     {
    22         if(h==0&&w==0) break;
    23         memset(dp,0,sizeof(dp));
    24         ans=1;
    25         dfs(1,0,0);
    26         for(int i=2; i<=h; i++)
    27         {
    28             for(int j=0; j<(1<<w); j++)
    29             {
    30                 if(dp[i-1][j]) ans=dp[i-1][j];
    31                 else continue;
    32                 dfs(i,~j&((1<<w)-1),0);
    33             }
    34         }
    35         printf("%lld
    ",dp[h][(1<<w)-1]);
    36     }
    37     return 0;
    38 }
    View Code
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define ll long long
     5 using namespace std;
     6 
     7 int n,m,cur;
     8 const int maxn=15;
     9 ll d[2][1<<maxn];
    10 
    11 void update(int a,int b)
    12 {
    13     if(b&(1<<m)) d[cur][b^(1<<m)]+=d[1-cur][a];
    14 }
    15 
    16 int main()
    17 {
    18     while(scanf("%d%d",&n,&m)!=EOF)
    19     {
    20         if(n==0&&m==0) break;
    21         memset(d,0,sizeof(d));
    22         cur=0;
    23         d[0][(1<<m)-1]=1;
    24         for(int i=0; i<n; i++)
    25         {
    26             for(int j=0; j<m; j++)
    27             {
    28                 cur^=1;
    29                 memset(d[cur],0,sizeof(d[cur]));
    30                 for(int k=0; k<(1<<m); k++)
    31                 {
    32                     update(k,k<<1);
    33                     if(i&&!(k&(1<<(m-1)))) update(k,(k<<1)^(1<<m)^1);
    34                     if(j&&!(k&1)) update(k,(k<<1)^3);
    35 
    36                 }
    37             }
    38         }
    39         printf("%lld
    ",d[cur][(1<<m)-1]);
    40     }
    41     return 0;
    42 }
    View Code
  • 相关阅读:
    PHP的轻量消息队列php-resque使用说明
    Laravel 5.1 事件、事件监听的简单应用
    Ubuntu常用命令
    Mysql 主从数据库
    MySQL日志
    两条比较实用的mysql导入导出命令
    Linux下mysql定时自动备份并FTP到远程脚本
    观察者模式范例
    devexpress gridControl1导出为pdf文件时出现 中文乱码的解决方案
    devexpress打印gridControl
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3789920.html
Copyright © 2011-2022 走看看