poj1038 Bugs Integrated,Inc. (状压dp)
题意:N*M的矩阵,矩阵中有一些坏格子,要在好格子里铺2*3或3*2的地砖,问最多能铺多少个。
我的方法好像和网上流传的方法不太一样...不管了....
由数据范围很容易想到状压dp
我们设某个状态的某一位表示这个格是某种地砖的左上角
那么就会有三种状态,理论上应该用三进制来存储,但我哪会三进制用位运算很方便于是就用2位二进制数来代替1位三进制数...
用00代表没有地砖,01代表铺了个2*3的地砖,10代表铺了个3*2的地砖
然后为了节约空间和时间,先对一个空行dfs一遍,得到这一行可能的地砖铺法,存储下来方便以后枚举状态(M=10时总共有274种状态)
然后设f[i][j][k]为第i行,状态为j,上一行状态为k的地砖数量
然后f[i][j][k]=max{f[i-1][k][l]},枚举k,l,然后判断符合不符合条件即可
为了防止爆内存可以用unsigned char强行卡用滚动数组(我第一次还真是用unsigned char强行卡过的..因为总共数量最多也就10*150/6=250种)
说着轻巧但是好难判啊
然后我不小心输出答案时用了%lld结果一直WA???求解答...
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#define inf 0x3f3f3f3f
#define LL long long int
using namespace std;
const int maxm=,maxn=,maxs=;
const int f11=,f01=;
const int b0101=,b101010=,b11=,b1111=,b111111=; inline LL rd(){
LL x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int sta[maxs],fsta[maxs],sct,mp[maxn];
int f[][maxs][maxs];
int N,M,K;char num[maxs]; inline void print(int x,int y){
if(y<=M*-) print(x>>,y+);
printf("%d",x&);
} void dfs(int x,int s,int fs,int c){
if(x>=M){sta[++sct]=s;fsta[sct]=fs;num[sct]=c;return;}
dfs(x+,s,fs,c);
if(x<=M-){
dfs(x+,s|(b0101<<(x<<)),fs|(b1111<<(x<<)),c+);
}if(x<=M-){
dfs(x+,s|(b101010<<(x<<)),fs|(b111111<<(x<<)),c+);
}
} inline bool judge1(int i,int s){
return (s&(mp[i]|mp[i+]))||(s&f01&mp[i+]);
} int main(){
//freopen("1038.in","r",stdin);
int i,j,k,l;
for(int t=rd();t;t--){
N=rd(),M=rd(),K=rd();
memset(mp,,sizeof(mp));
sct=;dfs(,,,);
for(i=;i<=K;i++){
int a=rd(),b=rd();
mp[a-]|=b11<<((b-)<<);
}mp[N+]=mp[N]=f11;
bool b=;
for(i=;i<N-;i++){
memset(f[b],-,sizeof(f[b]));
for(j=;j<=sct;j++){
if(judge1(i,sta[j])) continue;
if(!i){f[b][j][]=num[j];continue;}
for(k=;k<=sct;k++){
if((sta[j]&fsta[k])||judge1(i-,sta[k])) continue;
for(l=;l<=sct;l++){
if(fsta[j]&(sta[l]&f01)) continue;
f[b][j][k]=max(f[b][j][k],f[b^][k][l]);
}if(f[b][j][k]==-) continue;
f[b][j][k]+=num[j];
}
}b^=;
}int ans=;
for(i=;i<=sct;i++){
for(j=;j<=sct;j++) ans=max(ans,f[b^][i][j]);
}printf("%d\n",ans);
}
return ;
}
poj1038 Bugs Integrated,Inc. (状压dp)的更多相关文章
- POJ1038 Bugs Integrated, Inc 状压DP+优化
(1) 最简单的4^10*N的枚举(理论上20%) (2) 优化优化200^3*N的枚举(理论上至少50%) (3) Dfs优化状压dp O(我不知道,反正过不了,需要再优化)(理论上80%) (4) ...
- POJ 1038 Bugs Integrated, Inc. ——状压DP
状态压缩一下当前各格子以及上面总共放了几块,只有012三种情况,直接三进制保存即可. 然后转移的时候用搜索找出所有的状态进行转移. #include <map> #include < ...
- POJ1038 - Bugs Integrated, Inc.(状态压缩DP)
题目大意 要求你在N*M大小的主板上嵌入2*3大小的芯片,不能够在损坏的格子放置,问最多能够嵌入多少块芯片? 题解 妈蛋,这道题折腾了好久,黑书上的讲解看了好几遍才稍微有点眉目(智商捉急),接着看了网 ...
- poj2411 Mondriaan's Dream[简单状压dp]
$11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
$ POJ~1038~~\times Bugs~Integrated~Inc: $ (复杂的状压DP) $ solution: $ 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前 ...
- [POJ1038]状压DP
题意:给一个n*m的区域,里面有一些障碍物,往里面放2*3和3*2的矩形,矩形之间不能重叠,不能覆盖到障碍物,求能放置的最大个数.(n<=150,m<=10) 思路:看到m=10就应该往状 ...
- POJ1038 Bugs Integrated, Inc.
题目来源:http://poj.org/problem?id=1038 题目大意: 有一家芯片公司要在一块N*M的板子上嵌入芯片,其中1<=N<=150, 1<=M<=10,但 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
随机推荐
- 51Nod 1299 监狱逃离
这其实是一道树形DP的神仙题. 然后开始推推推,1 hour later样例都过不了 然后仔细一看题目,貌似像一个最小割模型,然后5min想了想建图: 首先拆点,将每个点拆成进和出两个,然后连边,边权 ...
- ASP.NET Core使用log4net记录日志
.NET常用的日志组件有NLog.Log4net等,.NET CORE下微软也自带了日志组件,到目前为止还没用过,而我本人常用的是log4net,下面简单讲讲.NET CORE下怎么使用log4net ...
- HNOI2019 JOJO
HNOI2019 JOJO jojo这个坑填上了,然鹅还有序列这个题啊啊啊啊啊啊 膜 可持久化这个东西没有强制在线就是假的,直接建树dfs就行了 这题是kmp的加强版,每次会加一堆相同的数进来 先想一 ...
- Html页面雪花效果的实现
简单介绍 昨天修改了一下博客所用的模板,冬天来了,给自己的博客加点雪花,感觉更有意境. 百度找到了非常多的结果,最终还是选用了cfs.snow.js,很赞压缩之后只有1kb左右,而且不会影响页面使用, ...
- maven docker 插件集成的几个小坑
昨晚看springboot视频的时候,发现可以使用docker-maven-plugin这个插件直接build出 docker 镜像到远程服务器上,感觉很方便,于是自己也试了一下,但是碰到了几个问题, ...
- centos7下/etc/rc.local文件里配置的开机启动项不执行的解决办法
习惯于在/etc/rc.local文件里配置我们需要开机启动的服务,这个在centos6系统下是正常生效的.但是到了centos7系统下,发现/etc/rc.local文件里的开机启动项不执行了!仔细 ...
- Nginx+keepalived 双机热备(主主模式)
之前已经介绍了Nginx+Keepalived双机热备的主从模式,今天在此基础上说下主主模式的配置. 由之前的配置信息可知:master机器(master-node):103.110.98.14/19 ...
- 《Linux内核分析》第八周:进程的切换和系统的一般执行过程
杨舒雯(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用gdb ...
- 接口(interface)与多态
1. 接口(interface)是抽象方法与常量值的集合: 2. 从本质上来讲,接口是一种特殊的抽象类,这种抽象类中只包含常量与方法的定义,而没有变量和方法的实现: 3. 接口中声明的属性默认为:pu ...
- 业务-----修改Service常用逻辑
注意:修改时唯一属性不能重复 //num==null 时,没有修改Num,不用考虑重复问题.//num!=null 时,修改了num.考虑重复问题 if(!StringUtils.isEmpty(re ...