传送门:http://poj.org/problem?id=2411

题目简述

有一个\(W\)行\(H\)列的广场,需要用\(1*2\)小砖铺满,小砖之间互相不能重叠,问

有多少种不同的铺法?

输入数据:

只有一行\(2\)个整数,分别为\(W\)和\(H\),\((1<=W,H<=11)\)

输出数据:

只有\(1\)个整数,为所有的铺法数。


妥妥状压

我们向上或者向右放砖头。

为什么呢?

令\(dp[i][j]\)代表\(i\)行\(j\)状态的方案数(\(j\)中的\(1\)代表这个位置在此行时是否被覆盖,不论它是被自己或者别人覆盖的)

此时当前行的\(0\)即可以约束下一行,向上放的过程。向右放即在本行处理。

处理的时候小心一点

code

#include <cstdio>
#include <cstring>
#define ll long long
const int N=12;
ll dp[N][1<<N];//dp[i][j]表示第i行j状态方案数
ll t[1<<N];
int m,n;
//其中,0代表在当前行时没有覆盖,1代表已经覆盖
//行数,上一行的状态,第几个位置,是否被左边照看,当前数字
void dfs(int line,int l_li,int dep,int is,int tt)
{
    if(dep==m+1)
    {
        dp[line][tt]+=dp[line-1][l_li];
        return;
    }
    int flag=!(l_li>>(m-dep)&1);//是否需要看上一行的
    if(is&&!flag)
        dfs(line,l_li,dep+1,0,tt<<1|1);
//被上一个看且不看上一行
    if(!is&&flag)
        dfs(line,l_li,dep+1,0,tt<<1|1);
//没被上一个看且要看上一行
    if(!is&&!flag)
    {
        if(dep!=m) dfs(line,l_li,dep+1,1,tt<<1|1);
        dfs(line,l_li,dep+1,0,tt<<1);
    }
//没被上一个看且不看上一行
}

int main()
{
    scanf("%d%d",&n,&m);
    while(m!=0&&n!=0)
    {
        memset(dp,0,sizeof(dp));
        dp[0][(1<<m)-1]=1;
        int cnt=0;
        t[++cnt]=(1<<m)-1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=cnt;j++)
                dfs(i,t[j],1,0,0);
            cnt=0;
            for(int j=0;j<(1<<m);j++)
                if(dp[i][j])
                    t[++cnt]=j;
        }
        printf("%lld\n",dp[n][(1<<m)-1]);
        scanf("%d%d",&n,&m);
    }
    return 0;
}

2018.5.10

POJ 2411 解题报告的更多相关文章

  1. POJ 1001 解题报告 高精度大整数乘法模版

    题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...

  2. poj分类解题报告索引

    图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...

  3. POJ 1003 解题报告

    1.问题描述: http://poj.org/problem?id=1003 2.解题思路: 最直观的的想法是看能不能够直接求出一个通项式,然后直接算就好了, 但是这样好水的样子,而且也不知道这个通项 ...

  4. POJ 1004 解题报告

    1.题目描述: http://poj.org/problem?id=1004 2.解题过程 这个题目咋一看很简单,虽然最终要解出来的确也不难,但是还是稍微有些小把戏在里面,其中最大的把戏就是float ...

  5. POJ 1005 解题报告

    1.题目描述   2.解题思路 好吧,这是个水题,我的目的暂时是把poj第一页刷之,所以水题也写写吧,这个题简单数学常识而已,给定坐标(x,y),易知当圆心为(0,0)时,半圆面积为0.5*PI*(x ...

  6. POJ 3414 解题报告!

    原题: Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13227 Accepted: 5550 Special Jud ...

  7. 广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告

    题目链接:http://poj.org/problem?id=3411 题目意思:N个city 由 m 条路连接,对于一条路(假设连接Cityia和 Cityb),如果从Citya 去 Cityb的途 ...

  8. POJ旅行商问题——解题报告

    旅行商问题 总时间限制: 1000ms 内存限制: 65536kB 描述 某国家有n(1<=n<=10)座城市,给定任意两座城市间距离(不超过1000的非负整数).一个旅行商人希望访问每座 ...

  9. POJ 2182 解题报告

    Lost Cows Time Limit: 1000 MS Memory Limit: 65536 KB Description N (2 <= N <= 8,000) cows have ...

随机推荐

  1. EBS 信用检查(二)

    Credit checking feature of Oracle OM provides the ability to check that the customer has sufficient ...

  2. 怎样将Android手机弄死机?

    将Android手机弄死机目前知道有两种方式: 第一种: 以root权限在shell中执行 stop 通过 start 但是这种串口还是可以用 第二种: suecho "c" &g ...

  3. jQuery插件AjaxFileUpload文件上传实现Javascript多文件上传功能

     Ajax file upload plugin是一个功能强大的文件上传jQuery插件,可自定义链接.或其它元素庖代传统的file表单上传结果,可实现Ajax动态提示文件上传 过程,同时支撑多文 ...

  4. session效率

    (1)-不恰当的request.getSession() 在HttpServlet中,HttpSession对象通常在request.getSession(true)方法调用时才创建. HttpSes ...

  5. Java进阶(十三)servlet监听器

    servlet监听器 Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当 增加一个HttpSession时 ...

  6. 一张图了解cocos2d坐标系

    一张图了解cocos2d坐标系 平面直角坐标系

  7. 提高HBase写性能

    以下为使用hbase一段时间的三个思考,由于在内存充足的情况下hbase能提供比较满意的读性能,因此写性能是思考的重点.希望读者提出不同意见讨论 1 autoflush=false的影响 无论是官方还 ...

  8. Lease问题

    经过查明原来是lease引发的问题.不过查问题的过程让我们耽误了很多修复故障的时间,很是不爽. 起因:datanode和regionserver以及master同时挂掉 现象:datanode重启后, ...

  9. Win7笔记本电脑启用虚拟WIFI共享上网

    今天看了一个帖子,win7系统通过笔记本的无线网卡,启用虚拟Wifi功能共享上网,自己尝试了一下,感觉很好用,至少没有无线路由的自己,手机可以上wifi了,更新软件玩微信等等,都方便多了,好了,废话不 ...

  10. OpenCV x64 vs2010 下打开摄像头录制视频写成avi(代码为转载)

    首先参照下面这里进行opencv x64位机器下面的配置 http://wiki.opencv.org.cn/index.php/VC_2010%E4%B8%8B%E5%AE%89%E8%A3%85O ...