dp合集 广场铺砖问题&&硬木地板


很经典了吧。。。

前排:思想来自yali朱全民dalao的ppt百度文库免费下载

后排:STO朱全民OTZ


广场铺砖问题

有一个 W 行 H 列的广场,需要用 1*2 小砖铺盖,小砖之间互相不能重叠,问
有多少种不同的铺法?
输入数据:
只有一行 2 个整数,分别为 W 和 H,( 1<=W, H<=11)
输出数据:
只有 1 个整数,为所有的铺法数。
样例:
Floor.in
2 4
Floor.out
5

dfs、bfs。。。算了吧
然而我看了一眼ppt,这不是SBT吗???
然后就写出来了
设f[i][j]表示第i行,状态为j的转移方法数
具体思想:一个状态有两种方式转移:全竖放转移and横放一个转移。
然后WA了
原因:横放可能有重复(比如□□□□,可以先左边两个也可以先右边两个),然后GG

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define lb(a) (a&-a)
#define Fname "floor"
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){rg int x=0;rg char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x;
}
int f[12][1<<11];
int cnt[1<<11],s[1<<11];
il bool cmp(int a,int b){return cnt[a]<cnt[b];}
int main(){
#ifdef xzzfreopen(Fname".in","r",stdin);freopen(Fname".out","w",stdout);
#endifint n=gi(),m=gi();if((n*m)&1){puts("0");return 0;}f[0][0]=1;int tot=(1<<m)-1;rep(i,0,tot){int j=i;while(j)++cnt[i],j-=lb(j);}rep(i,0,tot)s[i]=i;sort(s+1,s+tot+1,cmp);int g,j;rep(i,0,n-1)rep(jj,0,tot){j=s[jj];g=f[i][j];printf("f[%d][%d]=%d\n",i,j,f[i][j]);f[i+1][(~j)&tot]+=g;//所有的都竖放rep(k,0,m-2)if(!((1<<k)&j)&&!((1<<k+1)&j))f[i][j|(1<<k)|(1<<k+1)]+=g;}printf("%d\n",f[n][0]);return 0;
}

解决办法:一次转移
即通过dfs完成转移,做到不重不漏
在一个状态下dfs下一排可能的所有状态
具体见ppt

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define lb(a) (a&-a)
#define Fname "floor"
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){rg int x=0;rg char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x;
}
ll f[12][1<<11],n,m;
il vd dfs(const ll&F,const int&i,const int&j,int x,int now){if(now==m)f[i+1][x]+=F;else if(j&(1<<now))dfs(F,i,j,x,now+1);//已经有了else{dfs(F,i,j,x|(1<<now),now+1);//竖着if((now!=m-1)&&!(j&(1<<now+1)))dfs(F,i,j,x,now+2);//横着}
}
int main(){
#ifdef xzzfreopen(Fname".in","r",stdin);freopen(Fname".out","w",stdout);
#endifn=gi(),m=gi();if((n*m)&1){puts("0");return 0;}f[0][0]=1;rep(i,0,n-1)rep(j,0,(1<<m)-1)dfs(f[i][j],i,j,0,0);printf("%lld\n",f[n][0]);return 0;
}

其实还可以有更快的:每个j转移过去的都相同,可以先预处理每个j转移的,用邻接表实现,应该快的飞起
虽然我懒得写了(逃


硬木地板

举行计算机科学家盛宴的大厅的地板为 M×N (1<=M<=9, 1<=N<=9)的矩形。现在必须要铺上硬木地板砖。可以使用的地板砖形状有两种:
1) 2×1 的矩形砖
2) 2×2 中去掉一个 1×1 的角形砖
你需要计算用这些砖铺满地板共有多少种不同的方案。
注意:必须盖满,地板砖数量足够多,不能存在同时被多个板砖覆盖的部分。
输入数据
包含 M 和 N。
输出数据
输出方案总数,如果不可能那么输出 0 。
样例
输入:floor.in
2 3
输出:floor.out
5

会上面那个基本就会这个了额。。。
改一下dfs就好了

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define Fname "floor2"
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){rg int x=0;rg char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x;
}
ll f[10][1<<9],n,m;
il vd dfs(const ll&F,const int&i,const int&j,int x,int now){if(now==m)f[i+1][x]+=F;else if(j&(1<<now))dfs(F,i,j,x,now+1);else{if(!(x&(1<<now))){dfs(F,i,j,x|(1<<now),now+1);//竖着if(now&&(!(x&(1<<now-1))))dfs(F,i,j,x|(1<<now)|(1<<now-1),now+1);//┘if(now!=m-1)dfs(F,i,j,x|(1<<now)|(1<<now+1),now+1);//└}if((now!=m-1)&&!(j&(1<<now+1))){dfs(F,i,j,x,now+2);//横着if(!(x&(1<<now)))dfs(F,i,j,x|(1<<now),now+2);//┌dfs(F,i,j,x|(1<<now+1),now+2);//┐}}
}
int main(){
#ifdef xzzfreopen(Fname".in","r",stdin);freopen(Fname".out","w",stdout);
#endifn=gi(),m=gi();f[0][0]=1;rep(i,0,n-1)rep(j,0,(1<<m)-1)dfs(f[i][j],i,j,0,0);printf("%lld\n",f[n][0]);return 0;
}

PS.具体参见上面ppt链接

转载于:https://www.cnblogs.com/xzz_233/p/7550096.html

dp合集 广场铺砖问题硬木地板相关推荐

  1. CJOJ 【DP合集】最长上升序列2 — LIS2

    题面 已知一个 1 ∼ N 的排列的最长上升子序列长度为 K ,求合法的排列个数. 好题(除了我想不出来我应该找不到缺点), 想一想最长上升子序列的二分做法, 接在序列后面或者替换. 所以对于每一个位 ...

  2. P2500 - 【DP合集】背包 bound

    题面 Description N 种物品,第 i 种物品有 s i 个,单个重量为 w i ,单个价值为 v i .现有一个限重为 W 的背包,求能容 纳的物品的最大总价值. Input 输入第一行二 ...

  3. 铺砖 动态规划 DP

    解题思路:首先我们定义dp[i]为i列时候铺砖的方法数,我们考虑2 * 2的时候,一共有3个方法,考虑3 * 2的时候,多出了一列,如果我们竖着直接放一个,方法数就和2 * 2时候一样,即3,也就是d ...

  4. 我是一名铺砖匠——铺砖问题汇总(DP)

    鉴于多次遇到铺砖问题,因此目前遇到对此类问题进行总结: 铺砖问题主要分类: 1.简单的一维铺砖问题 2.二维铺砖问题 2*1的砖是否可以铺满N*M的地面 3.二维铺砖铺满有多少种方法 a.2*1的砖铺 ...

  5. 【状压DP+高精】【cofun1370】走道铺砖问题

    [cofun1370]走道铺砖问题 Description 有一个专门为装修设计方案的设计师.在某一天,他接到了一个项目,为一栋正在修建的大楼设计走道的地板铺设方案.此项目的委托人事先便进行了说明:地 ...

  6. 关于下拉刷新你是否真的非常理解还是只会搬砖?附 Android 实例子源代码文件下载地址380个合集...

    1,推荐几篇非常有用的博文 原创写的真的非常好 主要讲解原理,整体布局三部分组成以及设置padding等等作用, 下拉的具体实现 滑动到底部具体加载以及判断手势事件,再次推荐作者的 详细讲解 建议先看 ...

  7. 【好诗选读】新春诗会作品合集|黄晓平 蒋德明 徐书遐|刘红立 孟萌 刘东宏

    [好诗选读]新春诗会作品合集 本期诗人:黄晓平 蒋德明 徐书遐|刘红立 孟萌 刘东宏 开场白 作者:黄晓平 新春的开场白,在地 铺洒着未经车轮碾压的雪 在天,飘动没有方向感 没有归属的云彩,一场风雨后 ...

  8. 全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

    全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning 摘要 人们越来越需要将机器学习应用到各种各样 ...

  9. Hive的伴奏_Position Music顶级背景音乐合集243CD

    Position Music顶级背景音乐合集243CD 公司简介: Position Music是家音乐公司,神曲众多,但是其独立的Trailer Music系列质量上乘,而且多是录音室作品,由多位作 ...

  10. 计算机视觉与模式识别代码合集第二版three

    计算机视觉与模式识别代码合集第二版three     Topic Name Reference code Optical Flow Horn and Schunck's Optical Flow   ...

最新文章

  1. 机器学习算法加强——数据清洗
  2. 如何删除springboot中的子项目
  3. eclipse设置和启动优化(转)
  4. c读取ini配置文件_Go-INI - 超赞的Go语言INI文件操作库
  5. shiro+redis多次调用doReadSession方法的解决方案
  6. linux7yum安装mysql,CentOS7 使用yum安装mysql
  7. kettle-多文件合并
  8. 【IPM2020】一种处理多标签文本分类的新颖推理机制
  9. CF 4B. Before an Exam
  10. 三、实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方
  11. rose ha 的使用
  12. 【论文翻译】Mastering the game of Go without human knowledge (无师自通---在不借助人类知识的情况下学会围棋)
  13. 开发框架-移动开发平台: mPaaS
  14. apicloud mysql_APICloud 微信授权登录
  15. linux下TSL如何升级,Ubuntu18.04 TSL来了,你升级了吗?
  16. 解决百度网盘刷新不出来二维码
  17. git clone 修改配置 设置代理 加速
  18. w8系统的wmi服务器,Delphi通过WMI获取系统信息
  19. Apple PUSH Notication Service (APNS) 配置攻略
  20. NASA EARTHDATA GES DISC不用爬虫基于插件DownThemAll批量下载数据

热门文章

  1. MySQL心得1--数据库的基本概念
  2. 设计模式之职责链(Chain of Responsibility)
  3. ProcessPoolExecutor
  4. 9000多篇投稿,接收率只有15%,今年的AAAI你中了吗?
  5. 美团知识图谱问答技术实践与探索
  6. 【情感分析】基于知识引入的情感分析
  7. Python常用画图代码(折线图、柱状图、饼图)
  8. 一个函数解决【LeetCode 买卖股票的最佳时机】系列所有题目!
  9. 深度学习2.0-44.对抗生成网络-GAN
  10. 统计学习方法读书笔记2-极大似然估计与梯度下降法