题意: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. JQuery实现表格自动增加行,对新行添加事件

    实现功能: 通常在编辑表格时表格的行数是不确定的,如果一次增加太多行可能导致页面内容太多,反应变慢:通过此程序实现表格动态增加行,一直保持最下面有多个空白行. 效果: 一:原始页面 二:表1增加新行并 ...

  2. linux之cp和scp的使用

    cp 基本介绍 cp主要用于同一台服务器上,目录和文件的复制 表达式 cp [OPTIONS] SOURCE DEST --- 从源路径copy文件到目的路径 常用参数 -a same as -dpR ...

  3. .so相关总结

    1.windows 中查看进程依赖那个dll,使用depends,linux使用ldd命令. 2.查看dll中有哪些导出函数windows使用dumpbin,linux使用objdump查看so中有哪 ...

  4. vue项目搭建步骤

    https://blog.csdn.net/echo008/article/details/77099058 https://blog.csdn.net/echo008/article/details ...

  5. Spark MLlib之使用Breeze操作矩阵向量

    在使用Breeze 库时,需要导入相关包: import breeze.linalg._ import breeze.numerics._ Breeze创建函数 //全0矩阵 DenseMatrix. ...

  6. .NET Core 全新认识(转载)

    .NET Core 全新认识   cnblogs.com/yubinfeng/p/6626694.html 一.概述      .NET 经历14年,在Windows平台上的表现已经相当优秀,但是“跨 ...

  7. C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

  8. mysql误删root

    在Linux中有时安装Mysql会出现没有root用户的状况,或者说root账户被从mysql.user表中误删除,这样就导致很多权限无法控制.解决办法是重新创建root用户,并授予所有权限,具体方法 ...

  9. manjaro使用国内软件源

    虽然manjaro是基于arch修改的,但毕竟还是有些改动,如果可以用manjaro仓库里的,尽量不要用arch的源.如果嫌官方的软件源慢,可以直接一条命令修改成国内的软件源 sudo pacman- ...

  10. mysql 试题总结

    一.MySQL的复制原理以及流程 1.复制基本原理流程 1.主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中: 2.从:io线程——在使用start sla ...