hdu4804 Campus Design 插头|轮廓线DP
来源:互联网 发布:excel数据透视表怎么做 编辑:程序博客网 时间:2024/04/29 06:19
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804
题目大意:用1*1和1*2的骨牌去填一个n*m的矩阵,问友多少种方案(有约束条件)
限制条件如下:
1、矩阵上有障碍物,障碍物上不能填骨牌。
2、1*1的骨牌用的数目是固定的,必须是用c-d个。
思路:用dp[i][j][num]表示当前是用num个石头,状态为j,i(0/1)是用来滚动的.
题目下面给出代码加注释:
Campus Design
Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1050 Accepted Submission(s): 534
Problem Description
Nanjing University of Science and Technology is celebrating its 60th anniversary. In order to make room for student activities, to make the university a more pleasant place for learning, and to beautify the campus, the college administrator decided to start construction on an open space.
The designers measured the open space and come to a conclusion that the open space is a rectangle with a length of n meters and a width of m meters. Then they split the open space into n x m squares. To make it more beautiful, the designer decides to cover the open space with 1 x 1 bricks and 1 x 2 bricks, according to the following rules:
1. All the bricks can be placed horizontally or vertically
2. The vertexes of the bricks should be placed on integer lattice points
3. The number of 1 x 1 bricks shouldn’t be less than C or more than D. The number of 1 x 2 bricks is unlimited.
4. Some squares have a flowerbed on it, so it should not be covered by any brick. (We use 0 to represent a square with flowerbet and 1 to represent other squares)
Now the designers want to know how many ways are there to cover the open space, meeting the above requirements.
The designers measured the open space and come to a conclusion that the open space is a rectangle with a length of n meters and a width of m meters. Then they split the open space into n x m squares. To make it more beautiful, the designer decides to cover the open space with 1 x 1 bricks and 1 x 2 bricks, according to the following rules:
1. All the bricks can be placed horizontally or vertically
2. The vertexes of the bricks should be placed on integer lattice points
3. The number of 1 x 1 bricks shouldn’t be less than C or more than D. The number of 1 x 2 bricks is unlimited.
4. Some squares have a flowerbed on it, so it should not be covered by any brick. (We use 0 to represent a square with flowerbet and 1 to represent other squares)
Now the designers want to know how many ways are there to cover the open space, meeting the above requirements.
Input
There are several test cases, please process till EOF.
Each test case starts with a line containing four integers N(1 <= N <= 100), M(1 <= M <= 10), C, D(1 <= C <= D <= 20). Then following N lines, each being a string with the length of M. The string consists of ‘0’ and ‘1’ only, where ‘0’ means the square should not be covered by any brick, and ‘1’ otherwise.
Each test case starts with a line containing four integers N(1 <= N <= 100), M(1 <= M <= 10), C, D(1 <= C <= D <= 20). Then following N lines, each being a string with the length of M. The string consists of ‘0’ and ‘1’ only, where ‘0’ means the square should not be covered by any brick, and ‘1’ otherwise.
Output
Please print one line per test case. Each line should contain an integers representing the answer to the problem (mod 109 + 7).
Sample Input
1 1 0 011 1 1 201 1 1 211 2 1 2111 2 0 2011 2 0 2112 2 0 010102 2 0 001102 2 0 011114 5 3 511111110111010111111
Sample Output
001112102954
代码如下
#include <map>#include <set>#include <cmath>#include <queue>#include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long LL;const int maxn=12;const int INF=0x3f3f3f3f;LL dp[2][1<<maxn][22];const LL MOD=(LL)1e9+7;char mp[105][20];int cas=1,T,n,m,c,d,cur;void update(int a,int b,int num,bool flag){//放1*2的if(!flag)if(b&(1<<m)){dp[cur][b^(1<<m)][num]+=dp[1-cur][a][num];dp[cur][b^(1<<m)][num]%=MOD;return;}//放1*1的if(flag)if(b&(1<<m)){dp[cur][b^(1<<m)][num]+=dp[1-cur][a][num-1];dp[cur][b^(1<<m)][num]%=MOD;}}int main(){while(scanf("%d%d%d%d",&n,&m,&c,&d)==4){memset(dp,0,sizeof(dp));cur=0;for(int i=0;i<n;i++)scanf("%s",mp[i]);dp[cur][(1<<m)-1][0]=1;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 num=0;num<=20;num++){for(int k=0;k<(1<<m);k++){//该点为障碍物if(mp[i][j]=='0'){update(k,(k<<1)^1,num,false);continue;}//该点不放1*2 你会发现和不放1*1是一样的.所以下面的合并吧//update(k,k<<1,num,false);//该点不放1*2update(k,k<<1,num,false);//竖着放1*2if(i&&(!((1<<(m-1))&k)))update(k,(k<<1)^(1<<m)^1,num,false);//横着放1*2if(j&&(!(k&1)))update(k,(k<<1)^3,num,false);//放1*1,只要求上面放满就可以,石头数目会变化那稍微改一下就可以(true)if(num)update(k,(k<<1)^1,num,true);}}}}LL ans=0;for(int i=c;i<=d;i++){ans+=dp[cur][(1<<m)-1][i];ans%=MOD;}printf("%lld\n",ans);}return 0;}
1 0
- hdu4804 Campus Design 插头|轮廓线DP
- hdu4804 Campus Design 插头DP
- 【2013南京现场赛】1003 hdu4804 Campus Design 插头dp
- HDU 4804 Campus Design 轮廓线DP
- hdu 4804 Campus Design 轮廓线dp
- HDU 4804 Campus Design 轮廓线DP
- HDU 4804 Campus Design 轮廓线DP
- HDU4804 Campus Design
- hdu4804(轮廓线dp变形)
- HDU4804(插头dp)
- HDU 4804 Campus Design(插头DP)
- hdu 4804 Campus Design(插头dp)
- hdu 4804 Campus Design 插头dp
- hdu 4804 Campus Design (2013 南京 轮廓线dp)
- hdu 4804 Campus Design dp(记忆化搜索 /轮廓线 )
- POJ 2411 HDU4804【轮廓线+状压DP】
- [HDOJ 4804][Vjudge 48310] Campus Design [插头DP]
- HDU 4804 Campus Design(插头DP) (未理解)
- mysql的基础知识
- C++ string
- 端口号及分类
- 排序检索-152 Tree‘s Crowd
- android的版本兼容
- hdu4804 Campus Design 插头|轮廓线DP
- Windows平台PowerShell简介
- [快速搞定]android 状态栏一体化 沉浸式状态栏
- 面向对象_this关键字的概述和应用、this关键字的内存图解
- 中文错别字检查添加了二维码入口
- JMeter学习(三十七)Jmeter录制手机app脚本
- 第三章 3.5.1 定义和初始化内置数组
- 51单片机外设之——按键的检测(带有标志位的按键识别法)
- XJOI 1003 质因数分解