(1) 最简单的4^10*N的枚举(理论上20%)

(2) 优化优化200^3*N的枚举(理论上至少50%)

(3) Dfs优化状压dp O(我不知道,反正过不了,需要再优化)(理论上80%)

(4) 再剩下的,卡常数+卡常数+一个小优化(自己想吧,有可能被卡一个点)

(5) 如果还没有过,dfs中可能有重复的状态,用链式前向星优化一下,就差不多了

(6) 以上属于乱搞,正解在下面

(7) O(3^10*N),我们知道,设,我们更新第i行的状态,那么如果第i-1行的第j个位置不能被选取,则第i-2行的第j个位置同样不可以被选取,那么4^N状态转化为3^N,理论时间复杂度可能会超时(这个大概是60-70%的样子),所以需要用到Dfs优化(这个大概70-100%,有的人就能,反正我没有),之后同样,用链式前向星优化一下,就可以过了,当然,如果你还不满足于这个时间复杂度的话,还可以继续优化,这个就不写在这里了。

乱搞程序

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <queue>
using namespace std;
#define N 155
#define M 205
#define max(a,b) ((a)<(b)?(b):(a))
int f[3][M][M],cur[N],n,m,K,can[M],p[1<<15],cnt2,head[M][M];
int to[M*M*30],to2[M*M*30],to3[M*M*30],cnt[M*M*30],next[M*M*30];
int a,b,ans,cnt4;
void dfs(int f1,int f2,int step,int f3,int cnt1)
{
if(to[cnt4]!=f1||to3[cnt4]!=f2)
{
to[++cnt4]=f1;
to2[cnt4]=f3;
to3[cnt4]=f2;
cnt[cnt4]=cnt1;
next[cnt4]=head[a][b];
head[a][b]=cnt4;
}
if(step>=m)return ;
if(step<m-1&&!(f1&(3<<step))&&!(f2&(3<<step)))
{
dfs(f1|(3<<step),f2|(3<<step),step+2,f3|(3<<step),cnt1+1);
}
if(step<m-2&&!(f1&(7<<(step))))
{
dfs(f1|(7<<step),f2,step+3,f3|(7<<step),cnt1+1);
}
if(step<m-2&&!(f1&(7<<step))&&!(f2&(7<<step)))
{
dfs(f1|(7<<step),f2|(7<<step),step+3,f3,cnt1+1);
}
dfs(f1,f2,step+1,f3,cnt1);
return ;
}
void init()
{
memset(cur,0,sizeof(cur));
memset(head,0,sizeof(head));
cnt4=0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d%d",&n,&m,&K);
int mask=(1<<m)-1;
for(int i=1;i<=K;i++)
{
int x,y;
scanf("%d%d",&x,&y);
cur[x]|=(1<<(y-1));
}
cur[0]=cur[n+1]=mask;
ans=0;cnt2=0;
for(int j=0;j<=mask;j++)
{
int s=j;
if(((s&3)==1)||(s!=0&&((((~s))&((~s)<<2))&&(((((~s))&((((~s)))<<2))>>1)&s))))continue;
can[++cnt2]=j;
p[j]=cnt2;
}
for(int i=1;i<=cnt2;i++)
{
for(int j=1;j<=cnt2;j++)
{
if((can[i]&can[j])!=can[i])continue;
a=i,b=j;
dfs(can[i],can[j],0,0,0);
}
}
memset(f[1],0,sizeof(f[1]));
for(int i=1;i<n;i++)
{
memset(f[(i+1)&1],0,sizeof(f[(i+1)&1]));
for(int j=1;j<=cnt2;j++)
{
if(can[j]&cur[i])continue;
for(int k=j;k<=cnt2;k++)
{
if((can[k]&cur[i-1]))continue;
if((can[k]&can[j])!=can[j])continue;
for(int l=head[j][k];l;l=next[l])
{
if((to[l]&cur[i])||(to3[l]&cur[i-1])||(to2[l]&cur[i+1]))continue;
f[(i^1)&1][p[to2[l]]][p[to[l]|to2[l]]]=max(f[(i^1)&1][p[to2[l]]][p[to[l]|to2[l]]],f[i&1][j][k]+cnt[l]);
}
if(i==1)break;
}
}
for(int j=1;j<=cnt2;j++)
{
for(int k=1;k<=cnt2;k++)
{
ans=max(ans,f[(i+1)&1][j][k]);
}
}
}
printf("%d\n",ans);
}
return 0;
}

  

POJ1038 Bugs Integrated, Inc 状压DP+优化的更多相关文章

  1. poj1038 Bugs Integrated,Inc. (状压dp)

    题意:N*M的矩阵,矩阵中有一些坏格子,要在好格子里铺2*3或3*2的地砖,问最多能铺多少个. 我的方法好像和网上流传的方法不太一样...不管了.... 由数据范围很容易想到状压dp 我们设某个状态的 ...

  2. POJ 1038 Bugs Integrated, Inc. ——状压DP

    状态压缩一下当前各格子以及上面总共放了几块,只有012三种情况,直接三进制保存即可. 然后转移的时候用搜索找出所有的状态进行转移. #include <map> #include < ...

  3. POJ1038 - Bugs Integrated, Inc.(状态压缩DP)

    题目大意 要求你在N*M大小的主板上嵌入2*3大小的芯片,不能够在损坏的格子放置,问最多能够嵌入多少块芯片? 题解 妈蛋,这道题折腾了好久,黑书上的讲解看了好几遍才稍微有点眉目(智商捉急),接着看了网 ...

  4. poj 1185 状压dp+优化

    http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 291 ...

  5. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  6. HDUOJ Clear All of Them I 状压DP

    Clear All of Them I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 122768/62768 K (Java/Oth ...

  7. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    $ POJ~1038~~\times Bugs~Integrated~Inc: $ (复杂的状压DP) $ solution: $ 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前 ...

  8. bzoj2004 矩阵快速幂优化状压dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...

  9. 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra

    题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个 ...

随机推荐

  1. 妙用this关键字

    妙用this关键字 ## this关键字一般this关键字都是指的是对象的本身,在类的所有方法.构造器都可以拿到this引用,这是jvm"偷偷"帮我们传递进来的引用,指向调用方法对 ...

  2. SSH密钥认证添加方法和一些实用配置

    更改SSH端口号 用账号密码进入主机 sudo nano /etc/ssh/sshd-config 再其中添加Port 22等或改变该条 添加公钥到主机 cd ~ sudo mkdir .ssh 此处 ...

  3. Django rest framework源码分析(3)----节流

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  4. C#之Redis所欲为

    一 Redis是一种支持多种数据结构的键值对数据库 1.1Redis下载地址 :https://github.com/MicrosoftArchive/Redis 建议下载 .msi结尾的应用程序进行 ...

  5. 用shell处理以下内容 1、按单词出现频率降序排序! 2、按字母出现频率降序排序! the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support

    此题目有多种解法,sed.awk.tr等等,都可以解决此题,命令运用灵活多变. 编写shell脚本no_20.sh 解法1: #!/bin/bash ###-------------CopyRight ...

  6. 微信小程序-统一下单、微信支付(Java后台)

    1.首先分享 微信统一下单接口: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1   微信接口 签名 对比网址: https: ...

  7. PAT1052:Linked List Sorting

    1052. Linked List Sorting (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A ...

  8. MySql中innodb存储引擎事务日志详解

    分析下MySql中innodb存储引擎是如何通过日志来实现事务的? Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据 ...

  9. EasyUI集成Kindeditor使用

    在实际的项目中,我们需要在项目中集成富文本编辑器,而kindeditor作为一款优良的编辑器,在项目中或多或少都会用到! 实际效果图     使用方法: 1.首先下载Kindeditor编辑器,我这里 ...

  10. 微服务与SOA的区别

    微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...