poj 2411 Mondriaan's Dream

状态压缩DP

经典覆盖问题,输入n和m表示一个n*m的矩形,用1*2的方块进行覆盖,不能重叠,不能越出矩形边界,问完全覆盖完整个矩形有多少种不同的方案

其中n和m均为奇数的话,矩形面积就是奇数,可知是不可能完全覆盖的。接着我们来看n*m为偶数的情况

DP前先处理一下,交换n和m使n较大m较小,这样能减少状态数

另外数据中是有重复的,所以开辟一个ans数组来记录每组数据的结果,如果遇到相同的数据则不要计算直接输出答案

不用这个ans数组的话也不会超时,这个代码是跑出了950ms,加了这个记录答案的数组时间变为600ms

接着就看注释部分的讲解即可

/*
最上面的为第1行,最下面为第n行
从上到下按行DP
其中一行的状态我们用一个二进制表示,0表示没有被覆盖,1表示被覆盖了
最后得到一个01串,这个串变回十进制就是一个状态
定义状态dp[i][s],表示前i-1行已经放满,第i行的状态为s的方案数
状态转移方程为 dp[i][s]=sum{ dp[i-1][ss] } ,其中状态s与状态ss兼容
这个状态转移方程的内涵在于理解s和ss何为兼容
首先我们约定一个放置方法,就是竖着放的时候,我们暂且将其称为“上凸型摆放”
因为竖放必然占据第i-1行和第i行,我们约定这个方块是属于第i行的,也就是说它凸上去了
那么要在第i行的第j列竖放一个方块的话,第i-1行第j列必须没有方块
也就是说,第i行的放置是受到第i-1行的限制的,反过来说在第i行竖放了方块,也会影响第i-1行的状态
所以这样就可以讲解一下状态转移方程了,前i-2行已经放满了,第i-1行的状态为ss(dp[i-1][ss])
此时在第i行开始放一些方块,放的方法不定,可能横放可能竖放,但是按这个方案放完后
第i-1行刚好被填满,且第i行的状态变为了s,所以不难想到第i-1行的状态ss到第i行的状态s这个转移是唯一的
所以有 dp[i][s]=sum{ dp[i-1][ss] }
最后我们详细讨论一下s和ss在什么情况下是兼容的
1.第i行的第j列为1,第i-1行的第j列为1,这样的话,说明第i行的第j列一定不是竖放而是横放否则会与第i-1行的第j列冲突所以马上紧接着判断第i行第j+1列,如果是1,那么满足横放的规则,同时也要第i-1行第j+1列也要为1,否则的话这个格子没办法填充,成立后向左移动两格不满足上述条件的,就是两个不兼容或者不合法的状态
2.第i行第j列为1,第i-1行第j列为0,那么说明第i行第j列应该竖放并填充第i-1行第j列,成立后向左移动一格
3.第i行第j列为0,说明不放方块,那么第i-1行第j列必须为1,否则没法填充这个格子。若第i-1行第j列也为0,不兼容不合法(至于第i行第j列这个格子空着干什么,其实就是留出来给第i+1行竖放的时候插进来的)那么目标状态是什么,就是dp[n][maxs],maxs表示全部是1的串,即第n-1行以上全部覆盖满,第n行的状态为maxs,即没有空着的格子,也全部覆盖满了
即整个矩形全部被覆盖满了的状态最后是第1行的初始化问题,因为约定了“上凸型摆放”,所以第1行是不能竖放方格的,只能横放方格,
每横放一个必定占据两个格子,所以在判断一个状态(那个01串)的时候,连着的1的个数必定为偶数,如果出现了单独的1,说明不合法
*/#include <cstdio>
#include <cstring>
#define N 15
#define MAX (1<<11)+10long long dp[N][MAX];
long long ans[N][N];
int n,m;bool init(int s)
{for(int k=0; k<m; ){if(s & (1<<k)){if(k==m-1) return false;if(s&(1<<(k+1))) k+=2;else return false;}else k++;}return true;
}bool ok(int s, int ss)
{for(int j=0; j<m; )if(s & (1<<j)) //第i行第j列为1
        {if( ss & (1<<j)) //第i-1行第j列也为1,那么第i行必然是横放
            {//第i行和第i-1行的第j+1都必须是1,否则是非法的if( j==m-1 || !(s&1<<(j+1)) || !(ss&(1<<(j+1))) ) return false;else  j+=2;}else j++; //第i-1行第j列为0,说明第i行第j列是竖放
        }else //第i行第j列为0,那么第i-1行的第j列应该是已经填充了的
        {if(ss&(1<<j)) j++;//已经填充else return false;}return true;
}void solve()
{int maxs;if(n<m){ n=n^m; m=n^m; n=n^m; }//交换后n是行m是列,m较小,那么状态数也可以相应减少maxs=(1<<m)-1;memset(dp,0,sizeof(dp));for(int s=0; s<=maxs; s++) //枚举第一行所有可能的状态if(init(s)){dp[1][s]=1; //方案数都是1//printf("%d\n",s);
        }for(int c=2; c<=n; c++) //按行dpfor(int s=0; s<=maxs; s++) //第i行的状态for(int ss=0; ss<=maxs; ss++) //第i-1行的状态if(ok(s,ss))dp[c][s] += dp[c-1][ss];printf("%lld\n",ans[n][m]=ans[m][n]=dp[n][maxs]);
}int main()
{memset(ans,-1,sizeof(ans));while(scanf("%d%d",&n,&m)!=EOF){if(!n && !m) break;if(!ans[n][m]) {printf("%lld\n",ans[n][m]);continue;}if(n&1 && m&1) {ans[n][m]=ans[m][n]=0;printf("0\n");continue;}solve();}return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

又到618,.NET 千万级秒杀架构到底有多牛

年年618&#xff0c;次次高并发。其实这不仅仅是对618下各大电商平台的考验&#xff0c;更是如今每一个互联网应用上线后&#xff0c;会遇到的一个严峻的考验&#xff0c;渡得过 965&#xff0c;渡不过 996。在这个极速膨胀的互联网世界里&#xff0c; .NET 5 正是为了应对与解…

灯泡里的钨丝是怎么放进去的,这个视频解开我20多年的疑惑!

全世界只有3.14 % 的人关注了数据与算法之美白炽灯渐渐从我们的视线里消失了&#xff0c;不得不说这个一个伟大的发明&#xff0c;试想一下要是没有灯&#xff0c;只点蜡烛会有多少人抓狂&#xff0c;那么你知道灯泡里的钨丝是怎么放进去的吗&#xff0c;这个视频给你答案。灯泡…

exp 导数oracle,指数函数 exp(x) 导数的直接求法

在我读高中的时候&#xff0c;数学课程里是没有微积分的&#xff0c;当时自学微积分&#xff0c;用的是一种很简明的数学手册&#xff0c;里面只有结果没有证明。看到指数函数求导的时候&#xff0c;怎么也想不明白这个 \( ye^x\) 的导数 \( y’e^x\) 是怎么求出来的。在当时那…

分布式和集群的概念和区别

分布式系统是当前比较热门的话题&#xff0c;说到分布式就不得不提集群和单机&#xff0c;如果要学习分布式就要先对他的概念和功能有所了解单机单机就是把做的系统部署到一台服务器上&#xff0c;所有的请求业务都由这台服务器处理。显然&#xff0c;当业务增长到一定程度的时…

渤海发现大油田,证券会提示风险,微博回应流量造假,刘国梁制定史上最严奖惩体系,这就是今天的大新闻。...

今天是2月26日农历正月廿二今天星期二有点小忙下面是今天的大新闻渤海发现可供百万人用百年的大油田&#xff08;中化新网&#xff09;中国海油昨天(25日)对外宣布&#xff0c;位于我国渤海海域的渤中19-6气田&#xff0c;测试获得优质高产油气流&#xff0c;确定天然气探明地质…

SQLite.NET (32位) 在64位环境中无法正常调试

解决方法&#xff1a; 1、更换64的DLL 2、在Vs开发环境中&#xff0c;在项目属性里按下图操作&#xff0c;更改目标平台为 x86。 转载于:https://www.cnblogs.com/08shiyan/archive/2013/03/15/2961096.html

华为交换机linux版本号,Cisco和华为交换机常用配置命令总结

Cisco和华为交换机常用配置命令总结一、调试命令思科&#xff1a;Switch#show run 显示所有配置命令Switch#show ip inter brief 显示所有接口状态Switch#show vlan brief 显示所有VLAN的信息Switch#show version 显示版本信息华为&#xff1a;[Quidway]dis cur 显示…

WPF实现消息中心

↑↑↑点击上方蓝字关注我一、概要本文将讲解基于WPF实现一个消息中心的功能&#xff0c;比如常见的软件当中会经常收到服务端推送的“新闻”、“公告”等消息。这个时候就需要对这个需求进行分析了。功能分析如下&#xff1a;•消息内容显示。•消息管理增、删、批量删除。•消…

学Android的学习规划

为什么80%的码农都做不了架构师&#xff1f;>>> 客观地讲&#xff0c;会分为两条线来处理 学术线&#xff1a; 从学术上讲&#xff0c;Android分为几个模块是需要我循序渐进的&#xff1a; 初印象&#xff1a;IDE中Android各项结构 初印象&#xff1a;Android结…

每日一笑 | IE的反射弧也太长了吧......

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

linux开机自动挂载硬盘指定权限,Linux开机自动挂载硬盘

基本上所有1、对于fat32格式分区&#xff0c;向/etc/fstab中加入下面的内容&#xff1a;/dev/sdaX /media/Y vfat user,rw,utf8,umask000 0 0说明&#xff1a;/dev/sdaX可以以管理员身份通过命令fdisk-l得知&#xff0c;只要找你需要挂载的那个分区即可。/media/Y这是一个文件夹…

WPF 用Popup做下拉菜单

今天无聊时看到必应搜索首页的菜单挺好&#xff0c;于是想着模仿一下。。写着写着发现和我之前做的一个MenuItem很像&#xff0c;干脆直接拿来用了。。。看看效果&#xff1a;上图是bing.com首页右上角的下拉菜单&#xff0c;今天就来做了一个这样的。。我承认我偷懒了&#xf…

程序猿都在关注的6个优质公众号

CSDN学院▲长按图片识别二维码关注简介&#xff1a;CSDN学院&#xff0c;中国IT人必备的职业提升平台。在这里&#xff0c;看前辈文章&#xff0c;听专家分享&#xff0c;做一线项目&#xff0c;无畏场景&#xff0c;不限时间的紧跟前沿技术脚步。你的技术进阶之路&#xff0c;…

linux访问nfs端口号,linux nfs配置及访问控制

摘要NFS软件包nfs-utils portmap (rhel6换成了rpcbind ,所以启动服务时需要注意)NFS文件/etc/exports #N...NFS软件包nfs-utils portmap (rhel6换成了rpcbind ,所以启动服务时需要注意)NFS文件/etc/exports #NFS主配置文件 /etc/init.d/nfs #NFS启动脚本 /etc/init.d/protmap#p…

聊一聊.NET Core结合Nacos实现配置加解密

背景 当我们把应用的配置都放到配置中心后&#xff0c;很多人会想到这样一个问题&#xff0c;配置里面有敏感的信息要怎么处理呢&#xff1f;信息既然敏感的话&#xff0c;那么加个密就好了嘛&#xff0c;相信大部分人的第一感觉都是这个&#xff0c;确实这个是最简单也是最合适…

给孩子讲100个科学道理,不如带他做这些趣味实验!

▲数据汪特别推荐点击上图进入玩酷屋玩具和学习看似是两个对立的东西&#xff0c;孩子天性爱玩&#xff0c;家长却希望孩子能多学习。不一定非要啃课本才能汲取知识&#xff0c;有时候&#xff0c;在轻松有趣的游戏中也能学到课堂上学不到的知识。让学习变得有趣、高效——给孩…

linux服务器出现黄,linux服务器出现严重故障后的原因以及解决方法

linux服务器出现严重故障后的原因以及解决方法发布时间&#xff1a;2011-11-24 16:32:18 作者&#xff1a;佚名 我要评论linux服务器出现严重故障后的解决方法&#xff0c;本文为大家介绍四个步骤解决linux服务器严重故障。1、把系统安装光盘插入&#xff0c;重启机器&…

NET问答: 是否有通用的方法判断一个 Type 是 Number ?

咨询区 Adi Barda&#xff1a;请问是否有一种方式可以判断 .NET Type 是一个 number&#xff0c;这里的number不单单是 int &#xff0c;还有可能是 System.UInt32/UInt16/Double 等等&#xff0c;我真的不想写那种长长的 switch case 来摆平这个问题。比如下面的代码&#xff…

史上最污技术解读,我竟然秒懂了!

全世界只有3.14 % 的人关注了数据与算法之美或许有不少人对热备&#xff0c;冷备&#xff0c;云备了解不深。今天&#xff0c;数据汪就给大伙科普一下 IT 行业各种备份术语&#xff0c;以后别闹笑话了。1.冷备份假设你是一位女性&#xff0c;你有一位男朋友&#xff0c;于此同时…

深入了解Oracle ASM(一):基础概念

ASM基础概念 任何转载请注明源地址&#xff0c;否则追究法律责任&#xff01;&#xff1a;http://www.askmaclean.com/archives/know-oracle-asm.html 相关文章链接&#xff1a; Asm Instance Parameter Best Practice 为什么RHEL 6上没有ASMLIB? Unix上如何查看文件名开头…