zoukankan      html  css  js  c++  java
  • zoj 1100

    题目:在m*n的地板上铺上同样的1*2的地板砖,问有多少种铺法。

    分析:dp,组合,计数。经典dp问题,状态压缩。

                状态:设f(i,j)为前i-1行铺满,第i行铺的状态的位表示为j时的铺砖种类数;

                转移:由于仅仅能横铺或者竖铺。那么一个砖块铺之前的状态仅仅有两种;

                          且假设当前竖放会对下一行产生影响,建立相邻两行状态相应关系。

                          这里利用dfs找到全部f(i。j)的上一行的全部前置状态f(i-1,k)加和就可以。

                          f(i。j)= sum(f(i-1,k)){ 当中,f(i-1,k)能够产生f(i。j)状态 };

               (大黄的三维DP实现简单,效率较差。)

               组合学公式 :π(4cos(pi+i/(h+1))^2+4cos(pi+j/(w+1))^2) { 1<=i<=h/2,1<=j<=w/2 }。

    说明:纠结N久最后发现%I64d一直WA。%lld就过了。(2011-09-27 19:15)。


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct node
    {
        int s,l;
    }seg;
    seg S[ 10 ];
    
    long long F[ 12 ][ 1<<11 ];
    
    int  V[ 1<<11 ][ 99 ];
    int  Count[ 1<<11 ];
    
    //用dfs找到能够到达的状态 
    void dfs( int A, int B, int C )
    {
        if ( !A ) {
            V[ C ][ ++ Count[ C ] ] = B;
            return;
        }else {
            int V = A&-A;//取得最后一个 1的位置 
            dfs( A&~V, B&~V, C ); 
            if ( A&(V<<1) ) dfs( A&~(3*V), B, C );
        }
    }
    
    int main()
    {
        int n,m;
        while ( scanf("%d%d",&n,&m) != EOF && m ) {
            
            if ( n%2&&m%2 ) {printf("0
    ");continue;}
            if ( m>n ) {int t = m;m = n;n = t;}
            
            int M = (1<<m)-1;
            for ( int i = 0 ; i <= M ; ++ i ) {
                Count[ i ] = 0;
                dfs( i, M, i );
            }
            
            for ( int i = 0 ; i <= n ; ++ i )
            for ( int j = 0 ; j <= M ; ++ j )
                F[ i ][ j ] = 0LL;
            F[ 0 ][ M ] = 1LL;
                
            for ( int i = 1 ; i <= n ; ++ i )
            for ( int j = M ; j >= 0 ; -- j ) 
            for ( int k = Count[ j ] ; k >= 1 ; -- k ) 
                F[ i ][ j ] += F[ i-1 ][ V[ j ][ k ] ];
            
            printf("%lld
    ",F[ n ][ M ]);
        }
        return 0;
    }
    

  • 相关阅读:
    Github 代码在线在vscode中打开
    TP5如何查询字段为空
    浏览器总是报 'https://static.hae123.cn/gc/gc3.js 错误
    Sublime 复制到word 如何保留样式?
    pdf 在浏览器中是下载,而不是打开如何实现?
    Shell脚本中的set指令,比如set -x 和 set -e【转】
    Python面向对象进阶【转】
    Redis为什么变慢了?常见延迟问题定位与分析【转】
    史上最全的 Linux Shell 文本处理工具集锦【转】
    Linux运维常用命令总结【转】
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6788932.html
Copyright © 2011-2022 走看看