题意:n*m方格,有些格子有黑点,问你最多裁处几张2 * 3(3 * 2)的无黑点格子。

思路:我们放置2 * 3格子时可以把状态压缩到三进制:

关于状压:POJ-1038 Bugs Integrated, Inc. (状压+滚动数组+深搜 的动态规划),写的很详细

所以我们直接枚举每一行的所有可能状态,并算出每种状态最大值。这样我们到最后只要找到n行所有状态最大值就行了。

代码:

#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = + ;
const int INF = 0x3f3f3f3f;
const int MOD = ;
int dp[][], ter[];
int vis[][];
int t, n, m, k;
int now[], pre[];
void getNow(int i){
for(int k = ; k <= m; k++){
if(vis[i][k]){
now[k] = ;
}
else{
if(pre[k] <= ) now[k] = ;
else now[k] = ;
}
}
}
int getSt(){
int ret = ;
for(int k = ; k <= m; k++){
ret = ret * + now[k];
}
return ret;
}
void dfs(int i, int j, int num){
int nowSt; if(j > m){
nowSt = getSt();
dp[i % ][nowSt] = max(dp[i % ][nowSt], num);
return;
} // ▇ ▇ ▇
// ▇ ▇ ▇
if(j >= && !now[j - ] && !now[j - ] && !now[j]){
now[j - ] = now[j - ] = now[j] = ;
nowSt = getSt();
dp[i % ][nowSt] = max(dp[i % ][nowSt], num + );
dfs(i, j + , num + );
now[j - ] = now[j - ] = now[j] = ;
} // ▇ ▇
// ▇ ▇
// ▇ ▇
if(j >= && !now[j - ] && !now[j] && !pre[j - ] && !pre[j]){
now[j - ] = now[j] = ;
nowSt = getSt();
dp[i % ][nowSt] = max(dp[i % ][nowSt], num + );
dfs(i, j + , num + );
now[j - ] = now[j] = ;
} nowSt = getSt();
dp[i % ][nowSt] = max(dp[i % ][nowSt], num);
dfs(i, j + , num);
}
int main(){
ter[] = ;
for(int i = ; i <= ; i++){
ter[i] = ter[i - ] * ;
}
scanf("%d", &t);
while(t--){
scanf("%d%d%d", &n, &m, &k);
memset(vis, , sizeof(vis));
for(int i = ; i <= k; i++){
int x, y;
scanf("%d%d", &x, &y);
vis[x][y] = ;
} //0 都可以,1 上一行不可以,2 都不可以
int temp = ;
for(int i = ; i <= m; i++) temp = temp * + ;
memset(dp[], -, sizeof(dp[]));
dp[][temp] = ;
for(int i = ; i <= n; i++){
memset(dp[i % ], -, sizeof(dp[]));
for(int st = ; st < ter[m]; st++){
if(dp[(i + ) % ][st] == -) continue;
int tmp = st;
for(int j = m; j >= ; j--){
pre[j] = tmp % ;
tmp /= ;
}
getNow(i);
dfs(i, , dp[(i + ) % ][st]);
}
} int Max = -;
for(int i = ; i < ter[m]; i++)
Max = max(Max, dp[n % ][i]);
printf("%d\n", Max);
}
return ;
}

POJ 1038 Bugs Integrated, Inc.(DFS + 三进制状压 + 滚动数组 思维)题解的更多相关文章

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

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

  2. 三进制状压 HDOJ 3001 Travelling

    题目传送门 题意:从某个点出发,所有点都走过且最多走两次,问最小花费 分析:数据量这么小应该是状压题,旅行商TSP的变形.dp[st][i]表示状态st,在i点时的最小花费,用三进制状压.以后任意进制 ...

  3. ZRDay6A. 萌新拆塔(三进制状压dp)

    题意 Sol 这好像是我第一次接触三进制状压 首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了.. 因此我们需要维护的状态有三个 0:没打 1:打了怪物 没吃 ...

  4. Codeforces Round #297 (Div. 2) [ 折半 + 三进制状压 + map ]

    传送门 E. Anya and Cubes time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  5. HDU 3001 三进制状压DP

    N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方程: dp[i+b[k]][k]= ...

  6. hdu3001(三进制状压)

    题目大意: 现在给你一个有n个点和m条边的图,每一条边都有一个费用,每个点不能经过超过两次,求所有点至少遍历一次的最小费用 其中n<=10 m没有明确限制(肯定不会超过1e5) 一看到这个数据范 ...

  7. POJ 1038 Bugs Integrated, Inc.

    AC通道 神坑的一道题,写了三遍. 两点半开始写的, 第一遍是直接维护两行的二进制.理论上是没问题的,看POJ discuss 上也有人实现了,但是我敲完后准备开始调了.然后就莫名其妙的以为会超时,就 ...

  8. poj 1308Bugs Integrated, Inc. [三进制状压]

    题目链接[http://poj.org/problem?id=1038] 题意: 给出一个N*M大小的图,图中有K个坏点.N (1 <= N <= 150), M (1 <= M & ...

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

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

随机推荐

  1. 21.react 组件通信

    状态属性可以修改 this.setState()中可以写对象,也可以写方法 <script type="text/babel"> class Test extends ...

  2. export及export default的区别

    在JavaScript ES6中,export与export default均可用于导出常量.函数.文件.模块等,你可以在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方 ...

  3. day19 十九、ATM+购物车

    项目:ATM+购物车 作业需求:模拟实现一个ATM + 购物商城程序1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账 ...

  4. CH 2401 - 送礼 - [折半DFS+二分]

    题目链接:传送门 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_-b) ...

  5. LeetCode 1013 Partition Array Into Three Parts With Equal Sum 解题报告

    题目要求 Given an array A of integers, return true if and only if we can partition the array into three  ...

  6. SQL[Err]ORA-00932: inconsistent datatypes: expected NUMBER got CHAR:

    ORA-00932: inconsistent datatypes: expected NUMBER got CHAR: 获取的目标类型与源类型不一致,多出现在case when 语句中,when的结 ...

  7. GDB调试原理——ptrace系统调用

    本文由霸气的菠萝原创,转载请注明出处:http://www.cnblogs.com/xsln/p/ptrace.html 全部关于gdb的文章索引请点这里 引子: gdb基本上大家都在用,你有没有想过 ...

  8. numactl 修改 非统一内存访问架构 NUMA(Non Uniform Memory Access Architecture)模式

    当今数据计算领域的主要应用程序和模型可大致分为三大类: (1)联机事务处理(OLTP). (2)决策支持系统(DSS) (3)企业信息通讯(BusinessCommunications) 上述三类系统 ...

  9. mysql限制用户只能访问指定数据库

    1.使用root账户登录mysql mysql -uroot -ppassword 2.进入mysql数据库 mysql > use mysql 3.限制用户权限 GRANT SELECT, I ...

  10. 467A

    #include <stdio.h> int main() { int n; int p, q; int rooms=0; scanf("%d", &n); i ...