HDU 4804 Campus Design

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4804

题意:给你一个n*m的棋盘,让你用1x1和1x2的方块填满它,棋盘有些地方不能放方块,1x1的方块使用有限制,问一共有多少种方法填满

dp多开一维存放1x1的个数,之后就是正常的插头dp思路

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
const int mod=1e9+7;
int dp[2][22][1<<10];
int a[105][15];
int main()
{
    int n,m,c,d;
    int now=0,pre=1;
    while(scanf("%d%d%d%d",&n,&m,&c,&d)!=EOF)
    {
        int tot=1<<m;
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                scanf("%1d",&a[i][j]);
        memset(dp[now],0,sizeof(dp[now]));
        dp[now][0][tot-1]=1;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                swap(now,pre);
                memset(dp[now],0,sizeof(dp[now]));
                if (a[i][j])
                {
                    for(int k=0;k<=d;k++)
                        for(int st=0;st<tot;st++)//枚举轮廓线的状态
                        {
                            if (k&&(st>>j&1))
                                dp[now][k][st]=(dp[now][k][st]+dp[pre][k-1][st])%mod;//1x1
                            if (j&&(st>>j&1)&&!(st>>(j-1)&1))
                                dp[now][k][st|1<<(j-1)]=(dp[now][k][st|1<<(j-1)]+dp[pre][k][st])%mod;//横放1x2
                            dp[now][k][st^1<<j]=(dp[now][k][st^1<<j]+dp[pre][k][st])%mod;//竖放1x2
                        }
                }
                else
                {
                    for(int k=0;k<=d;k++)
                        for(int st=0;st<tot;st++)
                            if (st&1<<j)
                                dp[now][k][st]=(dp[now][k][st]+dp[pre][k][st])%mod;//不能放
                }
            }
        }
        int ans=0;
        for(int i=c;i<=d;i++)
            ans=(ans+dp[now][i][tot-1])%mod;
        printf("%d\n",ans);
    }
    return 0;
}

  

时间: 2024-10-14 17:07:54

HDU 4804 Campus Design的相关文章

HDU 4804 Campus Design(插头DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804 题意:给定一个图,0是不能放的,然后现在有1X1和1X2方块,最后铺满该图,使得1X1使用次数在C到D之间,1X2次数随便,问有几种放法 思路:插头DP的变形,只要多考虑1X1的情况即可,然后DP多开一维表示使用1X1的个数 代码: #include <stdio.h> #include <string.h> #include <algorithm> #include

hdu 4804 Campus Design(插头dp)

题目链接:hdu 4804 Campus Design 题目大意:有1?2的木块无穷个,要求在给定的图n?m的图上,用1?2和1?1的木块铺满,图上的0表示不需要铺的位置,1表示必须要铺的位置.并且1?1的使用数量必须在c到d之间.求总方案数. 解题思路:和uva11270一样的做法,只是需要多添加一位状态来表示用掉1得个数,以及要对当前位置判断是否为可放. #include <cstdio> #include <cstring> #include <algorithm>

hdu 4804 Campus Design 轮廓线dp

题意: 给出一个n*m的01矩阵,其中要求把矩阵里面的1用1*1或1*2的砖块铺满,矩阵里面的0为障碍物,问使用1*1的砖块数>=c && <=d 的方案有多少种. 限制: 1 <= n <= 100; 1 <= m <= 10; 1 <= c <= d <= 20; 思路: 因为 1 <= m <= 10 所以可以采用轮廓线dp, 具体状态解释在代码中说明. /*hdu 4804 Campus Design 轮廓线dp 题

【插头DP】HDU 4804 Campus Design

通道:http://acm.hdu.edu.cn/showproblem.php?pid=4804

HDU 4804 Campus Design(经典轮廓线问题扩展)

 题意:给定一个图,0是不能放的,然后现在有1X1和1X2方块,最后铺满该图,使得1X1使用次数在C到D之间,1X2次数随便,问有几种放法. 思路:经典问题多米诺的拓展,状态多开一维表示用了几个1*1砖块即可,注意位运算的优先级. #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorit

HDU 1007 Quoit Design (分治)

Quoit Design Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at some toys, with all the toys encircled awarded. In the field of Cyberground, the position of each toy is fixed, and the ri

hdu 1007 Quoit Design 分治求最近点对

Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 29344    Accepted Submission(s): 7688 Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat

HDU 1007 [Quoit Design] 分治

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 题目大意:N个点,求最近一对点的距离的一半. 关键思想:最傻瓜式的枚举所有点对的距离找最短 O(n^2),会TLE. 分治可以优化成O(nlogn).二分区间,考虑三种情形:点对的两点都在左区间.两点都在右区间.两点一左一右 前两种情况,可以递归地解出来,分别为d1,d2.第三种,可以依据min(d1,d2)收缩成一条带状区域(勾股定理显然). 然后对带中所有点进行处理,此时又可依据min(d

HDU 1007 Quoit Design

Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 130 Accepted Submission(s): 72   Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings a